天天看點

能使Oracle索引失效的六大限制條件

能使Oracle索引失效的六大限制條件
轉載自:http://www.2cto.com/database/201512/452441.html

Oracle 索引的目标是避免全表掃描,提高查詢效率,但有些時候卻适得其反。

  例如一張表中有上百萬條資料,對某個字段加了索引,但是查詢時性能并沒有什麼提高,這可能是 oracle 索引失效造成的。oracle 索引有一些限制條件,如果你違反了這些索引限制條件,那麼即使你已經加了索引,oracle還是會執行一次全表掃描,查詢的性能不會比不加索引有所提高,反而可能由于 資料庫維護索引的系統開銷造成性能更差。 下面就是總結的能使  Oracle 索引失效的七大限制條件。   1. 沒有 WHERE 子句   2. 使用 IS NULL 和 IS NOT NULL   SELECT ... FROM emp WHERE comm IS NULL; comm 列的索引會失效   3. WHERE 子句中使用函數   如果沒有使用基于函數的索引,那麼 where 子句中對存在索引的列使用函數時,會使優化器忽略掉這些索引。例如:   select * from staff where trunc(birthdate) = '01-MAY-82';   但是把函數應用在條件上,索引是可以生效的,把上面的語句改成下面的語句,就可以通過索引進行查找。   select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);   注意:對于 MIN, MAX 函數,Oracle 仍然使用索引。   4. 使用 LIKE ‘%T’ 進行模糊查詢   5. WHERE 子句中使用不等于操作   不等于操作包括:<>, !=, NOT colum >= ?, NOT colum <= ?   對于這個限制條件可以通過 OR 替代,例如: colum <> 0  ===>   colum>0 OR colum<0   6. 等于和範圍索引不會被合并使用   SELECT emp_id, emp_m, salary_q ... FROM emp WHERE job='manager' AND deptno>10   job 和 deptno 都是非唯一索引,這種條件下 oracle 不會合并索引,它隻會使用第一個索引。   7. 比較不比對資料類型   dept_id是一個varchar2型的字段,在這個字段上有索引,但是下面的語句會執行全表掃描。   select * from dept where dept_id = 900198;   這是因為 oracle 會自動把 where 子句轉換成 to_number(dept_id)=900198,相當于使用函數,這樣就限制了索引的使用。正确寫法如下:   select * from dept where dept_id = '900198';

繼續閱讀