我有个问题,我需要优化一个oracle中的存储过程. 
这存储过程是要操作1张拥有上万条数据的表,操作的类容就是,根据不同的查询条件获取到查询结果的count值,而这存储过程中有几十条这样的select语句,每次执行一次需要等很久,我已经用过建立索引,count(*)改为count(rowid),创建视图,动态SQL这些办法了但效果不明显,之所以请问大家是因为在sqlserver中同样的这种写法,运行却很快,而orcle却很慢 就不知道为什么了

解决方案 »

  1.   

    select count(1) from t where FIELD = ?;像这个SQL,在FIELD建一个索引,扫描这个索引就很快了。 但是要FIELD 不能为NULL才能用上索引。以你的情况,要检查下这些字段是否可空
      

  2.   

    想要count(1)统计快点,唯一的办法就是在where 后面的字段和group by中字段中创建索引统计的时候,直接走索引,不走全表扫描
      

  3.   

    LZ的数据库如果是11g的话,可以试试result_cache的功能。
    如果不是,那么有两种方法,一是建索引,建一个where条件和group by条件以及查询值的组合索引,看看执行效率会不会提高。
    二是针对这个procedure建个物化视图,将所有的查询结果union all起来,定时刷新后,直接从视图取数据。想问下LZ的环境是什么样子的,才上W条数据,查询就跑不动,也太弱了点,是不是之前有过大量数据导致HWM过高哦?将这张表移动一下表空间看看。