最近发现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 也很快结束。  完全不知道怎么回事了。以上两个情况,大家遇到过没,有没有什么方向?

解决方案 »

  1.   

    oracle会对表的数据进行统计,会进行一些“智能化"的处理,决定用不用索引啊之类,但是这种智能经常实际上很sb,就会造成有时好有时不好的情况
    没有太好的办法解决,只能就事论事,遇到事情的时候检查分析
      

  2.   

    第一个问题,我忽略了,建议 call 和 begin end 执行时各跟踪一下,看看有什么等待事件。第二个问题,ctas  确实是比 insert select 速度 要快。
    大概原因如下,不一定准确,也不权威:
    1、insert 是一个 DML 语句,要为每一行数生成 redo 和 undo 数据。而 ctas 是一个 ddl ,涉及到的 undo和 redo 数据,要小太多。
    2、如果原表上存在:索引、约束 等等条件,将会在每一个 insert 时检查他们,这个要的时间不好估计,而 ctas 却不涉及。
    3、insert into Mytable 要对每行数据的值,和 Mytable 的字段做匹配,如果类型不一致,还要做隐性转换,而 ctas 不涉及。
    4、insert into 如果没有加 append 选项的话,会查找可用块,而 ctas 不涉及。