基於COST優化,oracle什麼情況不走索引
今天具體開發的同事提出這樣一個問題
SQL> set autotrace traceonly explain
SQL> select * from xxx where aac001 = '111';
Execution Plan
----------------------------------------------------------
---------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
---------------------------------------------------------------
| 0 | SELECT STATEMENT | | 55 | 22275 | 3 (0)|
| 1 | TABLE ACCESS FULL| xxx | 55 | 22275 | 3 (0)|
---------------------------------------------------------------
Note
-----
在xxx.aac001上是存在索引的,但為什麼不走索引呢?
接到這個問題,首先排除該索引是否失效了
SQL> select index_name,status from user_indexes where index_name = 'IDX_XXX_AAC
001';
INDEX_NAME STATUS
------------------------------ --------
IDX_XXX_AAC001 VALID
答案是否定的。接著對錶和索引進行了分析
analyze index idx_xxx_aac001 validate structure;
analyze table xxx delete statistics;
analyze table xxx compute statistics;
仍然是全表掃描,奇怪了,隱式轉換不可能,開發人員還不至於犯如此錯誤
因為是開發庫,數量變化可能沒有規律,所以重新rebuild一下索引吧
SQL> set autotrace traceonly explain
SQL> select * from xxx where aac001 = '111';
Execution Plan
----------------------------------------------------------
---------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
---------------------------------------------------------------
| 0 | SELECT STATEMENT | | 65 | 26260 | 3 (0)|
| 1 | TABLE ACCESS FULL| xxx | 65 | 26260 | 3 (0)|
---------------------------------------------------------------
Note
-----
- 'PLAN_TABLE' is old version
SQL>
沒有起作用
不是組合索引,該列也不可能為空,那是什麼原因呢
SQL> select count(*) from xxx;
COUNT(*)
----------
68
SQL> select count(*) from xxx where aac001 = '111';
COUNT(*)
----------
65
換個人試一下
SQL> explain plan for select * from xxx where aac001 = '123';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----
| Id | Operation | Name | Rows | Bytes | Cost (%C
PU)|
--------------------------------------------------------------------------------
----
| 0 | SELECT STATEMENT | | 1 | 404 | 2
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
(0)|
| 1 | TABLE ACCESS BY INDEX ROWID| xxx | 1 | 404 | 2
(0)|
| 2 | INDEX RANGE SCAN | IDX_xxx_AAC001 | 1 | | 1
(0)|
--------------------------------------------------------------------------------
----
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Note
-----
- 'PLAN_TABLE' is old version
12 rows selected.
答案出來了,就是這個問題,由於是開發庫,沒有真實的資料,所有資料均為開發人員手動造的,辛苦了
以前總是在說,基於COST優化:表資料量小,全表掃描比走索引效率高
很簡單,你的表資料可能佔用一個塊,索引也是佔用一個塊,
如果全表掃描,只需讀一個塊,而使用索引則要讀兩個塊,
顯然使用索引成本更高,因此oracle決定使用全表掃描。
但真的碰到了,還是很難想到。通過這次,oracle優化器的智慧讓我折服了,對其印象更加深刻了,並不是所有情況使用索引都會加快查詢速度,full scan table 有時會更快,尤其是當查詢的資料量佔整個表的比重較大時。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13726712/viewspace-680555/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle組合索引什麼情況下生效?Oracle索引
- Oracle like、不等於、隱式轉換走索引與不走索引情況Oracle索引
- oracle全文索引之同步和優化索引做了什麼Oracle索引優化
- oracle order by索引是否使用的情況Oracle索引
- mysql索引不會命中的情況MySql索引
- mysql優化篇(基於索引)MySql優化索引
- Oracle 12.2中的索引統計被呼叫情況Oracle索引
- 驗證碼不顯示是什麼情況
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- 什麼是java序列化?什麼情況下需要序列化?Java
- Oracle 查詢行數很少,為什麼不走索引?Oracle索引
- Java類什麼情況下被初始化?Java
- mysql索引失效的情況MySql索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(一)Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(三)Oracle索引
- 【TUNE_ORACLE】你建立的索引為什麼不工作了?(二)Oracle索引
- Oracle優化案例-分割槽索引之無字首索引(六)Oracle優化索引
- MySQL哪些情況需要新增索引?MySql索引
- 看不了帖子了,什麼情況
- Oracle優化案例-正確的使用索引(二)Oracle優化索引
- Oracle優化案例-自定義函式索引(五)Oracle優化函式索引
- 什麼情況!華為開源JDK!JDK
- 什麼情況下你能接受 996996
- GreatSQL 中 Insert 慢是什麼情況?SQL
- SQLServer索引優化(2):對於索引中include的理解SQLServer索引優化
- 理解索引:索引優化索引優化
- 下一個成為IE會不會是Chrome,看看是什麼情況。Chrome
- [20231024]NULL值在索引的情況.txtNull索引
- 使用聯合索引的一種情況索引
- Mysql 會導致索引失效的情況MySql索引
- SQLServer索引優化(3):對於建組合索引的要求SQLServer索引優化
- 什麼情況下進行效能測試
- 什麼情況下會出現css阻塞?CSS
- 什麼情況下會出現js阻塞?JS
- mysql 關聯更新刪除不走索引優化MySql索引優化
- PostgreSQL/LightDB 不走並行是為什麼?SQL並行
- oracle 索引和不走索引的幾種形式Oracle索引
- Oracle 19c中基於函式的索引Oracle函式索引
- 容器化,微服務,DevOps,什麼情況下會三位一體?微服務dev