oracle 索引失效原因

2022-02-17 09:37:10 字數 1453 閱讀 7382

**  

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

oracle 索引失效的原因

索引失效 1 沒有查詢條件,或者查詢條件沒有建立索引 2 在查詢條件上沒有使用引導列 3 查詢的數量是大表的大部分,應該是30 以上。4 索引本身失效 5 查詢條件使用函式在索引列上 見12 6 對小表查詢 7 提示不使用索引 8 統計資料不真實 9 cbo計算走索引花費過大的情況。其實也包含了上面...

oracle 索引失效的原因

文章 url 失效原因 索引失效 1 沒有查詢條件,或者查詢條件沒有建立索引 2 在查詢條件上沒有使用引導列 3 查詢的數量是大表的大部分,應該是30 以上。4 索引本身失效 5 查詢條件使用函式在索引列上 見12 6 對小表查詢 7 提示不使用索引 8 統計資料不真實 9 cbo計算走索引花費過大...

like索引失效原因 索引失效的情況及原因定位

同事遇到乙個奇葩的問題,乙個表裡某個欄位建了索引,但是有的值走索引,有的值不走索引。因為一般情況乙個字段要麼完全不走索引,要麼走索引,怎麼會有的值走索引,有的不走索引。select 條件非常簡單,因為涉及到敏感資訊就不貼表結構了。例如select from order where status 2 ...