有这样一个查询语句
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%,需要优化,各位大侠看看,有何方案?
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. 创建一个单独的索引:为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创建一个索引,就可以节省时间了。你自己斟酌。
AND NVL(ENDDATE, SYSDATE + 1) > SYSDATE
》上面转成下面
And (ENDDATE IS NULL OR STARTDATE < ENDDATE AND ENDDATE > SYSDATE)
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