Oracle拒绝使用索引

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 PLANTABLE ACCESSFULL:

#  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]找到了; 请参阅下面的答案.

Aar*_*lla 5

好吧,这是我的错误:列有类型DATE,而不是TIMESTAMP.自从我使用以来to_timestamp(),Oracle没有办法使用索引.