正确高效使用数据库不可不知的索引失效问题

where语句中索引独立出现,索引才会起作用,不要放在表达式中(如: 转换函数一般放在值那边,不要放在列那边),或发生不合适的隐式转换

 

1.表达式例子

表employees的last_name列上有个索引
下面的语句使用索引
SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
  2  FROM   employees
  3  WHERE  last_name = 'Whalen';

但是下面的语句不使用索引
SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
  2  FROM   employees
  3  WHERE  lower(last_name) = 'whalen';

 

2.隐式转换

建立演示表test,在test的employee_id列建有索引
SQL> spool off
SQL> create table test as select * from employees;
表已创建。
SQL> create index i_test_id on test(employee_id);
索引已创建。
SQL> set autotrace trace exp
SQL> select * from test where employee_id='24000';

将列employees的类型由原来的整型修改为字符型,目的是然列employees发生隐式转换
SQL> truncate table test;
表被截断。
SQL> alter table test modify(employee_id varchar2(20));
表已更改。
SQL> insert into test select * from employees;
已创建107行。
SQL> commit;
提交完成。
SQL> set autotrace trace exp
SQL> select * from test where employee_id=100;

在上图中发生了一个隐式转换TO_NUMBER("EMPLOYEE_ID")
解决方法:转换函数一般放在值那边,不要放在列那边,因为在列那边会隐士转换,或其他原因,造成索引失效

SQL> select * from test where employee_id=to_char(100);

 

表employee列salary是NUMBER类型
SQL> select  * from  employee where  salary  like ‘13___’;
系统做了隐士准换 where  to_char(salary) like ‘13__’,则索引失效

 

3.索引实际应用之编码设计

根据需求来作编码,例如按一般的逻辑地区编码为省、市、县
但是系统中实际上大量查询是 like ‘%某一个市%‘,这样索引就失效
所以合适的编码是市、省、县 这样 like ‘某一个市%‘,索引就不会失效了

转载于:https://www.cnblogs.com/simplefrog/archive/2012/07/15/2592527.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值