首頁 > 資料庫 > Oracle > 主體

oracle怎麼會讓索引失效

WBOY
發布: 2022-01-26 10:25:37
原創
11019 人瀏覽過

oracle索引失效的原因:1、沒有使用WHERE子句;2、使用「IS NULL」和「IS NOT NULL」;3、在WHERE子句中使用函數;4、使用LIKE進行模糊查詢;5、在WHERE子句中使用不等於操作;6、比較不符資料型別等。

oracle怎麼會讓索引失效

本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。

oracle怎麼會讓索引失效

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(&#39;01-MAY-82&#39;) + 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=&#39;manager&#39; 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 = &#39;900198&#39;;
登入後複製

推薦教學:《Oracle影片教學

以上是oracle怎麼會讓索引失效的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!