各位CSDN的大牛们,你们好!
本人小白一枚
今天做Oracle存储过程的时候遇到一个很奇怪的问题。
将select出来的数据insert到一张临时表时花费时间特别的长(注:该表在此存储过程中第一次被使用,且一开始就被清空)
然后我将这一段insert和select复制到外面单独执行,能够正确出来数据且花费时间很短(正常)。
后来咨询部门同事,同事建议在插入到这张临时表的时候,先执行以下语句
execute immediate 'analyze table 临时表 compute statistics';
添加之后,果然就能顺利运行了。
然后我问同事,为什么要这么做,他表示也不清楚,只知道以前遇到这个问题就是这么做的。
最后我就被大伙怂恿来到CSDN来向各位大牛请教了。
第一次发帖,请多多指教!问:出现上述问题的原因是什么?analyze table的本质是什么?

解决方案 »

  1.   

    按理说不应该发生这种情况的,确定analyze的是被insert的表?而不是select查询中的表?或者说,insert表本身也在select查询中出现了?如果不是,那么这种方法就没什么普适性了。另外你说select和insert各自执行都很快?insert没有select子句跟着,只有跟上values才能是个合法的insert语句,不知道你是怎么insert的?而select查询独自执行很快也很可疑,用的是什么工具?有没有返回所有的结果数据?
      

  2.   

    忘了说了。analyze的本质就是对表进行各种统计,比如表里有多少数据?表里数据的分布情况如何等等,实际上到了9i之后,oracle建议使用dbms_stats包来完成统计信息的收集工作,analyze命令不大用了,它有一些缺陷,比如不能并行,比如收集分区表的时候存在一些问题等等。
      

  3.   

    楼主是什么样的临时表?temporary的吗?
      

  4.   

    analyze table的本质是收集表(数据)的统计信息,下次在对该表进行操作的时候,就会省去一些解析的时间,因此检索速度自然就会快很多。
      

  5.   

    临时表数据是不是 用delete 了,临时表可能数也有索引等,数据删除了,但是统计信息没有边,分析表只是为执行计划增加更新表信息!oracle 执行计划自动根据表统计信息选择最优的方法!或者你们建几个表,如果临时表的数据是全部删除建议用 turncate table xx!