【TUNE_ORACLE】你建立的索引為什麼不工作了?(三)

Attack_on_Jager發表於2021-04-07

說明

相關文章連結:

你建立的索引為什麼不工作了?(一): http://blog.itpub.net/69992972/viewspace-2766087/

你建立的索引為什麼不工作了?(二): http://blog.itpub.net/69992972/viewspace-2766688/

你建立的索引為什麼不工作了?(三): http://blog.itpub.net/69992972/viewspace-2766797/


前言

你是否有時會困惑:你剛建立的索引怎麼不工作了?如果你正因此感到困惑的同時看到這篇文章,那麼恭喜你,你的困惑即將被解決!我將常見的問題一一列出,並提供瞭解決辦法,下面和我一起來看看你的困惑是哪種吧!


索引未被使用的可能原因(三)

是否使用了檢視或子查詢?

查詢語句如果涉及到檢視或者子查詢時可能會被最佳化器等價改寫,比如檢視合併和謂詞推入 ,導致不使用索引(改寫目的之一是找到更多的訪問路徑從而選出效率最佳的方案)。重寫一般來說都是合併(merge)操作。

是否訪問了遠端表  

通常遠端表不會使用索引 。索引在分散式查詢中的使用依賴於被髮送到遠端的查詢。CBO將評估遠端訪問的成本,並評估比較傳送或者不傳送索引的謂詞到遠端站點的成本。因此,CBO 可以做出有關遠端表上使用索引的更加明智的決定。一個非常有效的方法就是在遠端建立包含相關謂詞的檢視並強制使用索引,之後在本地查詢中使用這個檢視。

是否使用並行執行

在並行執行時索引的採用比在序列執行時更加嚴格。一個最簡單的方法就是禁用並行,然後檢視該索引是否被使用。所以 不要隨便在SQL中開並行!

是否有關聯更新?

關聯更新是一種包含了子查詢的update語句。在某些情況下,基於成本的考慮,索引沒有被選使用是因為它依賴於一個子查詢返回的值。這種情況下,可以使用HINT來強制使用索引。

查詢是否使用了繫結變數?

CBO對like或範圍謂詞(如,between,>, <)的繫結變數不能判斷出準確的成本COST。這可能會導致索引不被使用。  

查詢是否引用了帶有延遲約束的列

如果一個表中的某一列上含有延遲約束(如NOT NULL)並且這一列上有索引,那麼不管這個約束當前是延遲狀態或是被顯式地設定為立即使用,我們都不會考慮使用這一列上的索引。如:

CREATE TABLE tab
( aaa INT CONSTRAINT aaa_not_null NOT NULL DEFERRABLE INITIALLY DEFERRED RELY, 
bbb INT CONSTRAINT bbb_not_null NOT NULL, 
ccc VARCHAR2(30) 
); 
CREATE INDEX idx_aaa ON tab(aaa); 
SET CONSTRAINTS ALL IMMEDIATE;   -- 將所有延遲約束設定為立即使用 
SET AUTOTRACE TRACEONLY EXPLAIN 
SELECT COUNT(1) FROM tab;   -- 索引不會被使用 
Execution Plan 
---------------------------------------------------------- 
Plan hash value: 56244968
------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Cost (%CPU)| Time | 
------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 | 
| 1 | SORT AGGREGATE | | 1 | | | 
| 2 | TABLE ACCESS FULL| TDC | 1 | 2 (0)| 00:00:01 | 
-------------------------------------------------------------------


索引HINT是否未生效?

有關索引HINT的具體用法和詳細功能,可以參考我的另外兩個系列博文:

Oracle Hint之概念與用法:   http://blog.itpub.net/69992972/viewspace-2756965/

Oracle Hint之常用Hint功能概述 :  http://blog.itpub.net/69992972/viewspace-2757087/



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992972/viewspace-2766797/,如需轉載,請註明出處,否則將追究法律責任。

相關文章