我有这张桌子:
create table demo (
key number(10) not null,
type varchar2(3) not null,
state varchar2(16) not null,
... lots more columns ...
)
这个索引:
create index demo_x04 on demo(key, type, state);
当我运行这个查询
select * from demo where key = 1 and type = '003' and state = 'NEW'
EXPLAIN PLAN
表明它进行了全表扫描。所以我删除了索引并再次创建它。EXPLAIN PLAN
仍然说全表扫描。怎么可能?
一些背景:这是历史数据,所以发生的事情是我查找带有状态的行CLEARED
并插入带有状态的新行NEW
(另外我从旧行中复制了一些值)。然后将旧行更新为USED
. 所以桌子总是在变大。我确实注意到索引的基数为 0(尽管我有数千个不同的值)。重新创建后,基数增加了,但 CBO 并不喜欢该指数。
第二天早上,Oracle 突然喜欢上了这个索引(可能是睡着了)并开始使用它,但时间不长。过了一会儿,处理速度从 50 行/秒下降到 3 行/秒,我再次看到“FULL TABLE SCAN”。到底是怎么回事?
就我而言,我需要处理大约一百万行。我分批提交更改。50. 在提交更新/重组索引或类似的东西后,我应该运行一些命令吗?
我在 Oracle 10g 上。
[编辑] 我在这张表中有 969'491 个不同的键,3 种类型和 3 种状态。