oracle怎樣會(huì)讓索引失效

oracle索引失效的原因:1、沒(méi)有使用WHERE子句;2、使用“IS NULL”和“IS NOT NULL”;3、在WHERE子句中使用函數(shù);4、使用LIKE進(jìn)行模糊查詢;5、在WHERE子句中使用不等于操作;6、比較不匹配數(shù)據(jù)類型等。

oracle怎樣會(huì)讓索引失效

本教程操作環(huán)境:Windows10系統(tǒng)、Oracle 11g版、Dell G3電腦。

oracle怎樣會(huì)讓索引失效

Oracle 索引的目標(biāo)是避免全表掃描,提高查詢效率,但有些時(shí)候卻適得其反。

例如一張表中有上百萬(wàn)條數(shù)據(jù),對(duì)某個(gè)字段加了索引,但是查詢時(shí)性能并沒(méi)有什么提高,這可能是 oracle 索引失效造成的。oracle 索引有一些限制條件,如果你違反了這些索引限制條件,那么即使你已經(jīng)加了索引,oracle還是會(huì)執(zhí)行一次全表掃描,查詢的性能不會(huì)比不加索引有所提高,反而可能由于數(shù)據(jù)庫(kù)維護(hù)索引的系統(tǒng)開(kāi)銷造成性能更差。 下面就是總結(jié)的能使 Oracle 索引失效的七大限制條件。

1. 沒(méi)有 WHERE 子句

2. 使用 IS NULL 和 IS NOT NULL

SELECT … FROM emp WHERE comm IS NULL; comm 列的索引會(huì)失效

3. WHERE 子句中使用函數(shù)

如果沒(méi)有使用基于函數(shù)的索引,那么 where 子句中對(duì)存在索引的列使用函數(shù)時(shí),會(huì)使優(yōu)化器忽略掉這些索引。例如:

select?*?from?staff?where?trunc(birthdate)?=?'01-MAY-82';

但是把函數(shù)應(yīng)用在條件上,索引是可以生效的,把上面的語(yǔ)句改成下面的語(yǔ)句,就可以通過(guò)索引進(jìn)行查找。

select?*?from?staff?where?birthdate?<p>注意:對(duì)于 MIN, MAX 函數(shù),Oracle 仍然使用索引。</p><p><strong>4. 使用 LIKE ‘%T’ 進(jìn)行模糊查詢</strong></p><p><strong>5. WHERE 子句中使用不等于操作</strong></p><p>不等于操作包括:, !=, NOT colum &gt;= ?, NOT colum </p><p>對(duì)于這個(gè)限制條件可以通過(guò) OR 替代,例如: colum  0? ===&gt;? ?colum&gt;0 OR colum</p><p><strong>6. 等于和范圍索引不會(huì)被合并使用</strong></p><pre class="brush:sql;toolbar:false">SELECT?emp_id,?emp_m,?salary_q?...?FROM?emp?WHERE?job='manager'?AND?deptno&gt;10

job 和 deptno 都是非唯一索引,這種條件下 oracle 不會(huì)合并索引,它只會(huì)使用第一個(gè)索引。

7. 比較不匹配數(shù)據(jù)類型

dept_id是一個(gè)varchar2型的字段,在這個(gè)字段上有索引,但是下面的語(yǔ)句會(huì)執(zhí)行全表掃描。

select?*?from?dept?where?dept_id?=?900198;

這是因?yàn)?oracle 會(huì)自動(dòng)把 where 子句轉(zhuǎn)換成 to_number(dept_id)=900198,相當(dāng)于使用函數(shù),這樣就限制了索引的使用。正確寫(xiě)法如下:

select?*?from?dept?where?dept_id?=?'900198';

推薦教程:《Oracle視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享