我有一個分區表,如下所示:甲骨文拒絕使用索引
create table demo (
ID NUMBER(22) not null,
TS TIMESTAMP not null,
KEY VARCHAR2(5) not null,
...lots more columns...
)
分區是在TS
列(每年一個分區)。
因爲我通過時間戳搜索了很多,我創建了一個組合索引:
create index demo.x1 on demo (ts, key);
查詢看起來是這樣的:
select *
from demo t
where t.TS = to_timestamp('2009-06-30 07:47:57', 'YYYY-MM-DD HH24:MI:SS')
我也嘗試添加and t.KEY = '00101'
但不幫幫我。
但EXPLAIN PLAN
說TABLE ACCESS
和FULL
:
# Operation Options Object Mode Cost Bytes Cardinality
0 SELECT STATEMENT ALL_ROWS 583804 287145 2127
1 PARTITION RANGE ALL 583804 287145 2127
2 TABLE ACCESS FULL HEADER ANALYZED 583804 287145 2127
指數沒有提到。什麼可能是錯的?
[編輯]出於某種原因,甲骨文完全錯誤的操作成本。那張桌子裏有112萬行。全面掃描單個分區的成本應該是2000萬,而不是600'000。這就是爲什麼它甚至忽略優化器提示。
[編輯2]在我的測試中,我跑過了這個令人費解的結果。當我運行這個select
:
select tx_ts
from kt.header
where tx_ts = to_timestamp('2009-06-30 07:47:57', 'YYYY-MM-DD HH24:MI:SS')
我得到這樣的解釋計劃:
0 SELECT STATEMENT ALL_ROWS 152 15616 1952
1 PARTITION RANGE ALL 152 15616 1952
2 INDEX FAST FULL SCAN HEADERX2 ANALYZED 152 15616 1952
所以,當我把自己限制在索引列的結果select
的,甲骨文決定使用索引。當我想要獲得所有列時,我必須等待全表掃描。這裏發生了什麼?
[EDIT2]找到它;請參閱下面的答案。
有一個你正在運行EXPLAIN PLAN的查詢的例子嗎? – 2009-10-15 16:04:57
表中有多少數據?另外,它是真的在做一個全表掃描,或者只是掃描一個特定的分區? – 2009-10-15 16:10:30
在這裏,你去。當我讀它時,它會掃描一切(全部1.1億行)。 – 2009-10-16 09:26:52