數據庫中索引會失效的幾種情況(oracle)

創建Oracle 索引的目的是爲了避免全表掃描數據,提高查詢效率,但是如果sql語句寫的不好致使索引失效,反而會影響數據查詢效率。以下幾種情況就會導致索引失效:

1. 沒有 WHERE 子句

   衆所周知,添加索引的字段必需要在where條件後適當使用纔會生效,如果連查詢條件都沒有,那肯定不會用到索引的。

2. 使用 IS NULL 和 IS NOT NULL

    select ... from  emp  where colnum    is  null;  colnum列的索引會失效

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’ 進行模糊查詢

  select * from student where name like 'aaa%' ;   // 'aaa%'  會用到索引

  select * from student where name like '%aaa'  ;    //'%aaa' 或者   '_aaa'     不會使用索引

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 temp where dept_id = 100101;

這是因爲 oracle 會自動把 where 子句轉換成 to_number(dept_id)=900198,相當於使用函數,這樣就限制了索引的使用。正確寫法如下:

select * from temp where dept_id = '100101';

 

 

參考文章:https://www.cnblogs.com/orientsun/archive/2012/07/05/2577351.htmlhttps://blog.csdn.net/dummyo/article/details/84194086https://www.cnblogs.com/lanseyitai1224/p/9217177.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章