我有一个分区表,如下所示:甲骨文拒绝使用索引
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