oracle介紹之oracle不走索引的7種常見情況!


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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM