限制索引導致索引無法被使用

2022-02-03 08:34:14 字數 1392 閱讀 3217

如下情況會產生限制索引

1 使用不等於操作符(<>、!=)

下面的查詢即使在cust_rating列有乙個索引,查詢語句仍然執行一次全表掃瞄。

select cust_id,cust_name from  customers where  cust_rating <> 'aa';

把上面的語句改成如下的查詢語句,這樣,在採用基於規則的優化器而不是基於代價的優化器(更智慧型)時,將會使用索引。

select cust_id,cust_name from customers where cust_rating < 'aa' or cust_rating > 'aa';

特別注意:通過把不等於操作符改成or條件,就可以使用索引,以避免全表掃瞄。

2 使用is null 或is not null

使用is null 或is not null同樣會限制索引的使用。因為null值並沒有被定義。在sql語句中使用null會有很多的麻煩。因此建議開發人員在建表時,把需要索引的列設成not null。如果被索引的列在某些行中存在null值,就不會使用這個索引(除非索引是乙個位圖索引,關於位圖索引在稍後在詳細討論)。

3 使用函式

如果不使用基於函式的索引,那麼在sql語句的where子句中對存在索引的列使用函式時,會使優化器忽略掉這些索引。 下面的查詢不會使用索引(只要它不是基於函式的索引)

select empno,ename,deptno  from emp where  trunc(hiredate)='01-may-81';

把上面的語句改成下面的語句,這樣就可以通過索引進行查詢。

select empno,ename,deptno from emp where hiredate<(to_date('01-may-81')+0.9999);

4 比較不匹配的資料型別

比較不匹配的資料型別也是比較難於發現的效能問題之一。

注意下面查詢的例子,account_number是乙個varchar2型別,在account_number欄位上有索引。下面的語句將執行全表掃瞄。

select bank_name,address,city,state,zip from banks where account_number = 990354;

oracle可以自動把where子句變成to_number(account_number)=990354,這樣就限制了索引的使用,改成下面的查詢就可以使用索引:

select bank_name,address,city,state,zip from banks where account_number ='990354';

特別注意:不匹配的資料型別之間比較會讓oracle自動限制索引的使用,

即便對這個查詢執行explain plan也不能讓您明白為什麼做了一次「全表掃瞄」。

不會使用索引,導致全表掃瞄情況

1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...

不會使用索引,導致全表掃瞄情況

1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...

不會使用索引,導致全表掃瞄情況

不會使用索引,導致全表掃瞄情況 1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 用not exists或者 外聯結 判斷為空 來代替 3 操作符 不等於 使用 同樣不會使用索引,因此對它的處理只會產生全表掃瞄 推薦方案 用其它相同功能的操作運算代替,如 a 0 改為 a 0 or a 0...