接触oracle索引有一段时间了,今天才听到前导索引这个名词,实在有点out了。 不过它倒是帮我解决了不小问题,很好!
具体关于前导索引的使用,在这里 http://blog.youkuaiyun.com/nickbest85/article/details/5681359 有很好的使用案例(我就是从这里知道的o(∩_∩)o...),已经很好了,我就不班门弄斧了。 只是分享一点感想。
索引要单独使用,不能用在函数 或者 连接符中,否则就不会采用了。
如该表 i_insuredamt_plan_tmp 有复合索引 PK_I_INSUREDAMT_PLAN_TMP ON (LNACCT, INST_NO, INPUT_DATE, BANK_NO)
语句1中使用了函数,没走索引,执行计划1;
语句1:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.bank_NO = '20' AND substr(i.LNACCT,2) = '2';
执行计划1:
描述 对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS 11028 1 79
TABLE ACCESS FULL I_INSUREDAMT_PLAN_TMP 11028 1 79
语句2中使用了连接符,也没有走索引,执行计划2;
语句2:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.bank_NO = '20' AND i.LNACCT||'-'||i.inst_no = '12-432';
执行计划2:
描述 对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS 11028 1 79
TABLE ACCESS FULL I_INSUREDAMT_PLAN_TMP 11028 1 79
语句3中单独使用,走了索引,执行计划3;
语句3:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.bank_NO = '20' AND i.LNACCT = '2';
执行计划3:
描述 对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS 4 1 79
TABLE ACCESS BY INDEX ROWID DRAFTDATA I_INSUREDAMT_PLAN_TMP 4 1 79
INDEX RANGE SCAN PK_I_INSUREDAMT_PLAN_TMP 3 1
语句4中没有引用前导索引,就全表扫描了,执行计划4(关于前导索引具体就见http://blog.youkuaiyun.com/nickbest85/article/details/5681359了,不再累述)。
语句4:
SELECT * FROM i_insuredamt_plan_tmp i WHERE i.inst_no = '12';
执行计划4:
描述 对象 耗费 基数 字节
SELECT STATEMENT, GOAL = ALL_ROWS 10986 159533 12603107
TABLE ACCESS FULL I_INSUREDAMT_PLAN_TMP 10986 159533 12603107