我有这张桌子:
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不喜欢指数.
第二天早上,甲骨文突然喜欢这个索引(可能已经睡过了它)并且开始使用它但不是很长时间.过了一会儿,处理从50行/秒下降到3行/秒,我再次看到“FULL TABLE SCAN”.到底是怎么回事?
就我而言,我需要处理大约一百万行.我批量提交变更. 50.在提交更新/重组索引之后是否应该运行一些命令?
我在使用Oracle 10g.
[编辑]我在这个表中有969’491个不同的键,3种类型和3种状态.