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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.