一個很簡單的查詢,為什麼用不到索引
http://www.itpub.net/viewthread.php?tid=964719&extra=&page=1
create table test as select rownum id,rownum-1 id2 from dba_objects;
create index idx_test1 on test(id2);
analyze table test compute statistics for all indexes;
SQL> set autot on
SQL> select id from test
2 where
3 id2 in
4 (
5 select '2' from dual
6 );
ID
----------
3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=30 Card=8168 Bytes=7
3512)
1 0 HASH JOIN (Cost=30 Card=8168 Bytes=73512)
2 1 TABLE ACCESS (FULL) OF 'TEST' (Cost=3 Card=6173 Bytes=37
038)
3 1 VIEW OF 'VW_NSO_1' (Cost=24 Card=8168 Bytes=24504)
4 3 SORT (UNIQUE) (Cost=24 Card=8168)
5 4 TABLE ACCESS (FULL) OF 'DUAL' (Cost=11 Card=8168)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
19 consistent gets
0 physical reads
0 redo size
373 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> select id from test
2 where
3 id2 in
4 (
5 '2','3'
6 );
ID
----------
3
4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=2 Bytes=12)
1 0 INLIST ITERATOR
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=3 Card=2 B
ytes=12)
3 2 INDEX (RANGE SCAN) OF 'IDX_TEST1' (NON-UNIQUE) (Cost=2
Card=2)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
408 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed
SQL>
對dual表進行分析後
會用上索引
因為dual是系統表一分析可能會其他系統表用到,會有影響
想到方法是將dual表改為其他表
create table t (id number);
analyze table t compute statistics;
SQL> select id from test
2 where
3 id2 in
4 (
5 select '2' from t
6 );
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=6 Card=1 Bytes=9)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST' (Cost=2 Card=1 Byt
es=6)
2 1 NESTED LOOPS (Cost=6 Card=1 Bytes=9)
3 2 VIEW OF 'VW_NSO_1' (Cost=4 Card=1 Bytes=3)
4 3 SORT (UNIQUE) (Cost=4 Card=1)
5 4 TABLE ACCESS (FULL) OF 'T' (Cost=2 Card=1)
6 2 INDEX (RANGE SCAN) OF 'IDX_TEST1' (NON-UNIQUE) (Cost=1
Card=1)
也用上索引了
也可以用下面這種方法:
select id from test
id2 in
(
select '2' from dual where rownum < 2
)
也會用上索引
樓主用的方法是把相關表統計資料刪除掉,完全用RBO了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7199859/viewspace-223950/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 索引為什麼能提供查詢效能...索引
- 一個簡單的樹查詢
- 一個簡單的字串查詢程式字串
- Oracle 查詢行數很少,為什麼不走索引?Oracle索引
- 為什麼我使用了索引,查詢還是慢?索引
- 什麼情況下需要建立索引? 索引的作用?為什麼能夠提高查詢速度?(索引的原理) 索引有什麼副作用嗎?索引
- Python為什麼發展這麼快速?原因很簡單!Python
- 一個查詢不走索引的例子索引
- 一個很簡單的PHP框架lyuePHP框架
- 為什麼機器學習會選擇Python語言?很簡單!機器學習Python
- php mysql 一個查詢優化的簡單例子PHPMySql優化單例
- 一個慢查詢報警的簡單處理
- 【MOS:1549181.1】為何在查詢中索引未被使用--為什麼索引沒有被使用索引
- 簡單的查詢
- 為什麼寫爬蟲用Python語言?原因很簡單!爬蟲Python
- 一個清理和查詢都要兼顧的簡單方案
- 為什麼所有的查詢條件都命中索引還是那麼慢?記一次慢查詢優化過程索引優化
- MySQL查詢為什麼沒走索引?這篇文章帶你全面解析MySql索引
- 為什麼 SQL 語句使用了索引,但卻還是慢查詢?SQL索引
- 簡單的mysql查詢MySql
- 為什麼所有的查詢條件都命中索引還是那麼慢?記一次慢查詢最佳化過程索引
- 為什麼 Redis 的查詢很快, Redis 如何保證查詢的高效Redis
- 查詢某個表的索引資訊索引
- 為什麼有時Oracle資料庫不用索引來查詢資料?(轉)Oracle資料庫索引
- 簡單記錄幾個有用的sql查詢SQL
- 一個簡單的字串,為什麼 Redis 要設計的如此特別字串Redis
- ClickHouse為什麼查詢速度快?
- MySQL - 資料查詢 - 簡單查詢MySql
- Mybatis簡單查詢MyBatis
- 想作一個很簡單的HA cluster軟體
- MySQL索引憑什麼能讓查詢效率提高這麼多?MySql索引
- 為什麼有些公司的IT很亂?
- 簡單的查詢語法
- ElasticSearch中的簡單查詢Elasticsearch
- 查詢訪問同一表的兩個以上索引(一)索引
- 為何在查詢中索引未被使用索引
- 為什麼新來的技術很難接手維護一個系統
- 【索引】Oracle查詢指定索引提高查詢效率索引Oracle