有一个表,大概有8000万行记录,按照时间每月自动进行分区,现在要在该表中按照时间范围和某一字段的值进行数据查询,我们的SQL语句是这样写的
select STCD,TM,DRP,INTV,PDR,DYP,WTH FROM ST_PPTN_R WHERE STCD in ('81621600','81621610','81621660','81621665','81621650','81751645','81752675','81621720') AND (
TM between to_date('2014-11-21 08:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2014-11-30 23:59:59','YYYY-MM-DD HH24:MI:SS') or 
TM between to_date('2014-12-01 00:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2014-12-31 23:59:59','YYYY-MM-DD HH24:MI:SS') or 
...
TM between to_date('2015-10-01 00:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2015-10-31 23:59:59','YYYY-MM-DD HH24:MI:SS') or 
TM between to_date('2015-11-01 00:00:00','YYYY-MM-DD HH24:MI:SS') and to_date('2015-11-26 08:00:00','YYYY-MM-DD HH24:MI:SS') ) AND DRP IS NOT NULL order by TM现在查询一次,大概花费44秒,求优化策略。

解决方案 »

  1.   

    1、执行计划贴下;
    2、分区键是哪个字段?
    3、stcd列的选择性如何?
    4、表里总共有多少个月的数据?
      

  2.   


    分区字段是TM,按时间每个月一个分区;
    STCD其实就是一个测站的站号,这个站基本一小时要回传一次数据,因此数据量较大
    表里有3年的数据
      

  3.   

    嗯,明白了,你的这个索引INDEX1是建立在(STCD,TM)列上的global索引吧?
    试着在列(TM,STCD)或(STCD)上建立local索引。
    create index idx_tm_stcd on ST_PPTN_R(tm,stcd) local;
    create index idx_stcd on ST_PPTN_R(stcd)  local;
    依次建立以上索引,分别测试建每个索引的效果。
      

  4.   


    调整为local index后,效率有较大的增长,目前大概8-9秒,还有没有优化空间?
      

  5.   

    索引建在TM 和 STCD两个列上的。
    服务器配置还可以,我也觉得速度稍慢。
      

  6.   

    服务器是存储用的是硬盘吧?
    另外,你也可以把索引建在STCD上试试。上面的贴里有建索引的语句。
      

  7.   

    我怎么看有的论坛上说如果STCD不是主键的话,加了索引的话,在in语句里也是无效的?
      

  8.   

    可以把这一张表分成若各干表,至于怎么分你说了算,按月按年都行
    oracle 分区表