如下情況會產生限制索引
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...