将SQL语句由开放区间扫描(>=),修改为封闭区间(betweenxxxandmax_value)。使得数据在索引局部顺序是“对的”。如果采用这种方式仍然不走索引扫描,还可以进一步细化分段或者采用“逐条提取+批绑定”的方法。
9.建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEXSKIPSCAN概念,
10、like'%liu'百分号在前请输入标题
11,notin,notexist
可以尝试把notin或者notexsts改成左连接的方式(前提是有子查询,并且子查询有where条件)。
例如:
SELECT /*+INDEX(ICIRCLEICONMAST_IX1)*/ I.ICONNO, I.CIRCLEID, I.FILEPATH, I.REGDT, I.FILEPATH||'/'||I.FILENAMEIMGNAME, I.FILEPATH||'/'||'th_160_'||I.FILENAMESMALLIMGNAME, I.MEMBERID, I.ADMCHKSTATUS, I.ADMCHKORIGINALSTATUS, ROWNUMRN FROMCIRCLEICONMASTI WHEREI.REGDTBETWEENTO_DATE('20120619','YYYYMMDD')-10000AND TO_DATE('20120621','YYYYMMDD') ANDNOTEXISTS( SELECTC.VALIDFLG FROMCIRCLEMASTC WHEREC.VALIDFLGIN('N','F') ANDI.CIRCLEID=C.CIRCLEID) ANDI.ADMCHK='N' |
改成左连接:
SELECT /*+INDEX(ICIRCLEICONMAST_IX1)*/ I.ICONNO, I.CIRCLEID, I.FILEPATH, I.REGDT, I.FILEPATH||'/'||I.FILENAMEIMGNAME, I.FILEPATH||'/'||'th_160_'||I.FILENAMESMALLIMGNAME, I.MEMBERID, I.ADMCHKSTATUS, I.ADMCHKORIGINALSTATUS, ROWNUMRN FROMCIRCLEICONMASTI,CIRCLEMASTC WHEREI.REGDTBETWEENTO_DATE('20110620','YYYYMMDD')AND TO_DATE('20120621','YYYYMMDD')+1 ANDC.VALIDFLGNOTIN('N','F') ANDI.CIRCLEID=C.CIRCLEID ANDI.ADMCHK='N' |
总结:oracle中有很多情况会导致index失效,并且走全表扫描的代价是相当大的,所以在写sql的时候一定要注意这个会使索引失效的情况,养成良好的习惯。