有这样一个查询语句
Select to_char(RSN) RSN,
       to_char(SID) SID,
       to_char(OID) OID,
       PDID,
       PRID,
       to_char(GSID) GSID,
       to_char(RGSID) RGSID,
       to_char(PPOID) PPOID,
       VERSION,
       STARTDATE,
       to_char(APOID) APOID,
       APTP,
       ENDDATE,
       to_char(COID) COID,
       OLDENDDATE,
       to_char(IU) IU,
       VERSION,
       to_char(SPID) SPID,
       to_char(RFID) RFID,
       to_char(RLID) RLID,
       PRSNT,
       OBDL
  From T_PO_BB
 Where SID = '123456'
   And RSN = 100
   And (STARTDATE < ENDDATE OR ENDDATE IS NULL)
   AND NVL(ENDDATE, SYSDATE + 1) > SYSDATE
 order by SPID ASC, PRID, STARTDATE;
 
 相应表有索引
 
 create index IDX_SID_B on T_PO_BB (SID)
 create unique index PK_OSN on T_PO_BB (OID, RSN)
在执行的时候CPU占用超过16%,需要优化,各位大侠看看,有何方案?

解决方案 »

  1.   

    除去掉to_char以外,
    建议如下:
    1. 创建一个单独的索引:为RSN
    2. order by SPID, PRID, Startdate中间的那个asc是多余的。
       为这个order by 创建组合索引:(spid, prid, startdate)
    3. 注意到这两个条件:
    And (STARTDATE < ENDDATE OR ENDDATE IS NULL)
      AND NVL(ENDDATE, SYSDATE + 1) > SYSDATE
     由于涉及到NULL值,所以比较费时间,有没有可能让enddate不为NULL,将其值更新为比较延后的时间,这样为enddate创建一个索引,就可以节省时间了。你自己斟酌。
      

  2.   

    And (STARTDATE < ENDDATE OR ENDDATE IS NULL)
    AND NVL(ENDDATE, SYSDATE + 1) > SYSDATE
    》上面转成下面
    And (ENDDATE IS NULL OR STARTDATE < ENDDATE AND ENDDATE > SYSDATE)
      

  3.   

    SELECT STATEMENT, GOAL = ALL_ROWS Cost=6 Cardinality=1 Bytes=109
         SORT ORDER BY Cost=6 Cardinality=1 Bytes=109
    TABLE ACCESS BY INDEX ROWID Object owner=acb Object name=T_PO_BB Cost=5 Cardinality=1 Bytes=109
        INDEX RANGE SCAN Object owner=acb Object name=IDX_SID_B Cost=3 Cardinality=2