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

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 ‘某一个市%‘,索引就不会失效了

posted @ 2012-07-15 17:27 simplefrog 阅读(...) 评论(...) 编辑 收藏