【TUNE_ORACLE】你建立的索引為什麼不工作了?(三)
說明
相關文章連結:
你建立的索引為什麼不工作了?(一): 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(一)Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(二)Oracle索引
- oracle為什麼不走索引Oracle索引
- 做軟體測試,為什麼你的工資不過萬?
- Python 的切片為什麼不會索引越界?Python索引
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- 你為什麼不愛遊戲了?遊戲
- 為什麼該SQL的執行計劃不走索引???SQL索引
- 為什麼說會不會SQL,決定著你的工資?方向不對,努力也白費!SQL
- Oracle 查詢行數很少,為什麼不走索引?Oracle索引
- 為什麼python建立檔案打不開Python
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- 為什麼Linux不適合你?(轉)Linux
- 為什麼Linux不適合你? (轉)Linux
- 這就是為什麼你學不會DDD
- MySQL 為什麼全文索引查中文找不結果MySql索引
- MySQL索引那些事:什麼是索引?為什麼加索引就查得快了?MySql索引
- 為什麼工廠老闆們從不「迷信」人工智慧?人工智慧
- 【TUNE_ORACLE】Oracle索引設計思想(四)三星級索引Oracle索引
- 為什麼IDEA不推薦你使用@Autowired ?Idea
- 為什麼你作為一個.NET的程式設計師工資那麼低?程式設計師
- [MySQL]為什麼非聚簇索引不儲存資料位置MySql索引
- 11條理由告訴你,為什麼你的網站不賣座網站
- MySQL如何建立一個好索引?建立索引的5條建議【宇哥帶你玩轉MySQL 索引篇(三)】MySql索引
- 為什麼索引的PCTUSED被設定為0索引
- Mysql:好好的索引,為什麼要下推?MySql索引
- 資質平平的你為什麼不選擇小程式代理?
- 為什麼你還是學不會程式設計程式設計
- 你為什麼總是學不會設計模式?設計模式
- MYSQL索引為什麼這麼快?瞭解索引的神奇之處MySql索引
- 為什麼為什麼為什麼為什麼為什麼你要做一名程式設計師?程式設計師
- (轉)Oracle為什麼不使用我的索引?Oracle索引
- 【TUNE_ORACLE】列出SQL謂詞中需要建立索引的列SQL參考OracleSQL索引
- 為什麼你不應該辭職去做遊戲應用遊戲
- mysql為什麼加索引就能快MySql索引
- 為什麼程式設計師的工資那麼多!憑什麼?程式設計師
- [年薪60W的技巧]工作了5年,你真的理解Netty以及為什麼要用嗎?(深度乾貨)Netty
- oracle commit提交到底作了什麼OracleMIT