基於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索引被抑制情況Oracle索引
- SQL優化--強制走索引失效的情況SQL優化索引
- mysql索引不會命中的情況MySql索引
- oracle全文索引之同步和優化索引做了什麼Oracle索引優化
- oracle為什麼不走索引Oracle索引
- mysql優化篇(基於索引)MySql優化索引
- Oracle什麼情況下需要rebuild indexOracleRebuildIndex
- 驗證碼不顯示是什麼情況
- oracle order by索引是否使用的情況Oracle索引
- Oracle union all 不走索引的優化Oracle索引優化
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- 什麼是java序列化?什麼情況下需要序列化?Java
- oracle優化器和不走索引的原因Oracle優化索引
- Oracle -- left join 什麼情況可以直接改成joinOracle
- Java類什麼情況下被初始化?Java
- SQL SERVER中什麼情況會導致索引查詢變成索引掃描SQLServer索引
- [zt] Oracle不使用索引的幾種情況Oracle索引
- argv[0]在什麼情況下不等於程式名
- CBO Cost Formulas基於成本優化器的成本計算公式大全ORM優化公式
- [zt] 基於索引的SQL語句優化索引SQL優化
- Oracle 索引的優化Oracle索引優化
- mysql索引失效的情況MySql索引
- 什麼情況!華為開源JDK!JDK
- Oracle 12.2中的索引統計被呼叫情況Oracle索引
- Oracle 查詢行數很少,為什麼不走索引?Oracle索引
- Oracle軟體安裝 - 什麼情況下需要relink allOracle
- MySQL哪些情況需要新增索引?MySql索引
- 為什麼使用API?什麼情況下避免使用API?API
- 什麼情況讓程式設計師處於水深火熱中程式設計師
- 基於成本的Oracle優化法則Oracle優化
- 下一個成為IE會不會是Chrome,看看是什麼情況。Chrome
- Oracle對索引分析的優化Oracle索引優化
- 在什麼情況下用index unique scansIndex
- 什麼情況下你能接受 996996
- GreatSQL 中 Insert 慢是什麼情況?SQL