Oracle查詢語句中指定索引時優化器及指定索引不好使的處理方法


Oralce多表聯合查詢時,Oracle優化器會選擇相應的索引以提高性能。一些情況下,Oracle優化器不能選擇正確的索引,此時可以通過查詢語句指定特定的索引以提高性能。

例:有兩個表A和B 要進行聯合查詢 A表有索引 IDX_A1_A2  ,A表和B表的關聯條件是A.ID=B.ID

通常的SQL查詢是 select A.c1,A,c2,B.c3,B.c4 from A,B where A.ID=B.ID  但是數據量在的時候感覺很慢,建立的索引起作用,需要手動指定一下.

加指定索引的語法是: /*+ index(表名,索引名) */

例如:

 select  /*+ index(A,IDX_A1_A2 ) */ A.c1,A,c2,B.c3,B.c4 from A,B where A.ID=B.ID 如果表有重命名,表名要輸入重命名的表名.

例如:

 select  /*+ index( t ,IDX_A1_A2 ) */ t.c1,t,c2,B.c3,B.c4 from A t,B where t.ID=B.ID

但某些特殊情況下,即便使用上述方式在SQL查詢語句中指定要使用使用的索引,Oracle仍可能固執的使用它認為正確的索引,

如何讓Oracle放棄它自認為正確的索引而改用指定的索引呢:

仍以前面例子為例,查詢條件中“ A.ID=B.ID”,若ID為A表的主鍵、B表的外鍵,Oracle很有可能優先使用些唯一性索引,而放棄A表上的其他索引,

若想讓Oracle放棄使用此唯一性索引,可以將查詢條件改為“A.ID||'a'= B.ID||'a',A.ID后加了“ || 'a'”后A表上的唯一性索引即會失效,

Oracle近爾會使用A1表上的其他索引:

例:select  /*+ index( t ,IDX_A1_A2 ) */ t.c1,t,c2,B.c3,B.c4 from A t,B where t.ID||'a'=B.ID||'a'

在A.ID后加“ || 'a'”只是讓Oracle放棄索引的一種方法,導致Oracle不使用索引的情況有很多,都可以拿來達到這個目的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM