正确高效使用数据库不可不知的索引失效问题
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
總結
以上是生活随笔為你收集整理的正确高效使用数据库不可不知的索引失效问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IIS 内部运行机制
- 下一篇: 电容的一些知识