oracle的索引使用:复合索引中的前导索引

接触oracle索引有一段时间了,今天才听到前导索引这个名词,实在有点out了。  不过它倒是帮我解决了不小问题,很好!

 

具体关于前导索引的使用,在这里 http://blog.csdn.net/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.csdn.net/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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值