最近发现2个很奇怪的问题,一直没有找到合理的解释,有没有高手来看看。1.有一个package,里面放了很多procedure. 某次项目现场人员使用 call 包名.过程名 的方法 运行了1天没有出结果,session也一直没有死掉。 后来改成了 begin 包名.过程名 end; 调用很快就出结果. 不知道是什么原因。 代码本身没有问题,在其它项目现场一直是call 好好的。
2. 有一段 sql : insert into tablea nologging select XXXX from XXX; 运行好长时间一直把 临时表空间撑爆,报错退出。
但实际查出来的结果集只有6000多行。 表也重建过,没有解决。 然后试了 create table tableb as select XXXX from XXX; 很快出结果, 再使用 insert into tablea nologging select * from tableb 也很快结束。 完全不知道怎么回事了。以上两个情况,大家遇到过没,有没有什么方向?
2. 有一段 sql : insert into tablea nologging select XXXX from XXX; 运行好长时间一直把 临时表空间撑爆,报错退出。
但实际查出来的结果集只有6000多行。 表也重建过,没有解决。 然后试了 create table tableb as select XXXX from XXX; 很快出结果, 再使用 insert into tablea nologging select * from tableb 也很快结束。 完全不知道怎么回事了。以上两个情况,大家遇到过没,有没有什么方向?
解决方案 »
- oracle delete删除数据后磁盘空间的释放问题
- 能否读取ORACLE表中的备注信息?
- 时间相减得到的值 单位是什么
- 如何恢复数据库中的一个表的数据至一个时间点?
- 如何将oracle数据库将多行数据转变成一行数据?
- 为什么安装不上oracle provider ole db?
- 替代变量实现批量输入更新数据
- 怎样恢复数据......
- 初学者请教关于数据索引问题?
- 同样的代码,ojdbc驱动,在win10下开发环境报这个异常,win7下正常,求解?
- oracle 分组之后,拿到最小成绩的id 和课程 和成绩
- 为什么会出现 Warning: Trigger created with compilation errors
没有太好的办法解决,只能就事论事,遇到事情的时候检查分析
大概原因如下,不一定准确,也不权威:
1、insert 是一个 DML 语句,要为每一行数生成 redo 和 undo 数据。而 ctas 是一个 ddl ,涉及到的 undo和 redo 数据,要小太多。
2、如果原表上存在:索引、约束 等等条件,将会在每一个 insert 时检查他们,这个要的时间不好估计,而 ctas 却不涉及。
3、insert into Mytable 要对每行数据的值,和 Mytable 的字段做匹配,如果类型不一致,还要做隐性转换,而 ctas 不涉及。
4、insert into 如果没有加 append 选项的话,会查找可用块,而 ctas 不涉及。