Aar*_*lla 2 oracle indexing partitioning
我有一个像这样的分区表:
create table demo (
ID NUMBER(22) not null,
TS TIMESTAMP not null,
KEY VARCHAR2(5) not null,
...lots more columns...
)
Run Code Online (Sandbox Code Playgroud)
分区位于TS
列上(每年一个分区).
由于我通过时间戳搜索了很多,我创建了一个组合索引:
create index demo.x1 on demo (ts, key);
Run Code Online (Sandbox Code Playgroud)
查询如下所示:
select *
from demo t
where t.TS = to_timestamp('2009-06-30 07:47:57', 'YYYY-MM-DD HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)
我也尝试添加,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
Run Code Online (Sandbox Code Playgroud)
没有提到指数.可能有什么不对?
[编辑]出于某种原因,甲骨文完全错误地计算了操作的成本.我在该表中有1.12亿行.完全扫描单个分区的成本应该是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')
Run Code Online (Sandbox Code Playgroud)
我得到了这个解释计划:
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
Run Code Online (Sandbox Code Playgroud)
因此,当我将自己限制在索引列的结果时select
,Oracle决定使用索引.当我想获得所有列时,我必须等待全表扫描.这里发生了什么?
[EDIT2]找到了; 请参阅下面的答案.