本帖最后由 swellmelody 于 2009-08-22 11:08:33 编辑

解决方案 »

  1.   

    你没做statistic数据收集是一个很大的原因,别外一个,你的表必须进行按时间分区,建立分区索引,不然,资源消耗太大你在sqlplus下执行一下这个语句,可能会有点慢:sql> exec dbms_stats.gather_table_stats(user, 'ACCESSLOG', method_opt=>'for all indexed cloumns', cascade=>true);执行过后你再执行你的语句,肯定会快一些,别忘了做分区,很简单的,你另做一张表叫 temp,这个表有分区,表结构和accesslog一样,把数据放到这张表中,做完后,把表面一改就ok了
      

  2.   

    多谢楼上,正在执行。
    另外一个很奇怪的问题。
    类似下面的sql,却只需要2-11秒。
    select count(t.accesslog_id)
             from accesslog t
             where 
             t.recordtime >= to_date('2009-03-01', 'YYYY-MM-DD')
             and t.recordtime < to_date('2009-03-02', 'YYYY-MM-DD') + 1
    但是换一个索引,却需要117秒:select count(t.accesslog_id)
             from accesslog t
             where t.purviewcode = 'ABC0070010'   
      

  3.   

    试了下将purviewcode 索引禁用掉,改成这样,居然在10秒左右执行完,不明白啊~~
     select nvl(count(t.accesslog_id),0) 
             from accesslog t
             where t.purviewcode||'' = 'ABC0070010'   
             and t.citycode = '0001' 
             and t.recordtime >= to_date('2009-03-01', 'YYYY-MM-DD')
             and t.recordtime < to_date('2009-03-02', 'YYYY-MM-DD') + 1
      

  4.   

    其实很简单,你因为选择结果数据量比较大,用索引不划算,而你没有用上CBO,用了RBO(默认),所以结果不理想。你执行了我给你的dbms_stats语句后,这些选择那种执行计划更划算的事情oracle自己会去做的
      

  5.   


    根据你的最上面的一个贴没有禁用purviewcode时的执行计划是
    SELECT STATEMENT, GOAL = CHOOSE
    SORT AGGREGATE
      TABLE ACCESS BY INDEX ROWID Object owner=WWWW Object name=ACCESSLOG
      INDEX RANGE SCAN Object owner=JX1W Object name=IDX_ACCESSLOG_PURVIEWCODE 这里可以看到是走的IDX_ACCESSLOG_PURVIEWCODE索引,这个时候由于你一直没有统计,所以统计信息不准确,而根据此时的统计信息,oracle的优化器,觉得IDX_ACCESSLOG_PURVIEWCODE的成本上会少一些,而走了这个,但是实际上,错误的统计信息误导了oracle的优化器,也许此时直接用IDX_ACCESSLOG_RECORDTIME会更好些,
    所以当去掉了IDX_ACCESSLOG_PURVIEWCODE这个索引,Oracle优化器当然别无选择的使用了IDX_ACCESSLOG_RECORDTIME,反而误打误闯的和正实的情况一致了。所以就快了。
      

  6.   


    这里你可以用show parameter optimizer_mode查看你的oracle优化器的优化方式如果是Cbo的话,这个也要基于你所作的统计信息,如果没有做过统计,CBO也就没有做cost评估的依据,所以虽然是CBO,但是实际上还是用RBO了,而且如果不常做统计的话,由于CBO是以统计为依据的,所以这时CBO的依据信息有问题,CBO也会不准。
      

  7.   

    oracle优化器的优化方式为:choose。
      

  8.   

    删掉PURVIEWCODE的原索引,
    改建联合索引:create index xxx on accesslog(RECORDTIME,PURVIEWCODE)