索引列上计算引起的索引失效

典型案例1: 

  
Sql代码   收藏代码
  1. select *  
  2.  from arc_s_app a  
  3. where a.APP_TYPE_CODE = '203'  
  4.   and a.ORG_NO like '23404%'  
  5.   and (a.END_DATE - sysdate) < 7  
  6.   and (a.END_DATE - sysdate) >= 0  




修改为如下sql: 

Sql代码   收藏代码
  1. select *  
  2.   from arc_s_app a  
  3.  where a.APP_TYPE_CODE = '203'  
  4.    and a.ORG_NO like '23404%'  
  5.    and a.END_DATE < sysdate + 7  
  6.    and a.END_DATE >= sysdate  

   

    上面的典型案例中,在列a.END_DATE上进行了计算a.END_DATE - sysdate,导致列a.END_DATE上的索引失效,修改前执行时间422ms,修改后执行时间16ms;索引失效的原因是索引是针对原值建的二叉树,将列值计算后,原来的二叉树就用不上了;为了解决索引列上计算引起的索引失效问题,将计算放到索引列外的表达式上。 

典型案例2: 

Sql代码   收藏代码
  1. select *  
  2.   from s_app a, c_cons b, sa_c_trade_type c  
  3.  where a.CONS_NO = b.CONS_NO  
  4.    and c.TRADE_CODE = a.TRADE_CODE  
  5.    and to_char(a.HANDLE_TIME, 'yyyyMMdd') >= '20080901'  
  6.    and to_char(a.HANDLE_TIME, 'yyyyMMdd') < '20080902'  
  7.    and a.ORG_NO in (select ORG_NO from sa_org where ORG_TREE like '23101%')  




修改为如下sql: 

Sql代码   收藏代码
  1. select *  
  2.   from s_app a, c_cons b, sa_c_trade_type c  
  3.  where a.CONS_NO = b.CONS_NO  
  4.    and c.TRADE_CODE = a.TRADE_CODE  
  5.    and a.HANDLE_TIME >= to_date('20080901''yyyyMMdd')  
  6.    and a.HANDLE_TIME < to_date('20080902''yyyyMMdd')  
  7.    and a.ORG_NO in (select ORG_NO from sa_org where ORG_TREE like '23101%')  




   上面的案例中,在列a.HANDLE_TIME进行了to_char(a.HANDLE_TIME, 'yyyyMMdd')计算,导致列a.HANDLE_TIME上的索引失效;修改前执行时间78ms,修改后执行时间31ms。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值