gpt4 book ai didi

oracle - 为什么 Oracle 会忽略 "perfect"索引?

转载 作者:行者123 更新时间:2023-12-02 08:58:02 24 4
gpt4 key购买 nike

我有这张表:

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。所以 table 总是在增长。我注意到索引的基数是 0(尽管我有数千个不同的值)。重新创建后,基数增加了,但 CBO 不太喜欢该索引。

第二天早上,Oracle 突然喜欢上了这个索引(可能是睡过头了)并开始使用它,但时间不长。一段时间后,处理速度从 50 行/秒下降到 3 行/秒,我再次看到“全表扫描”。这是怎么回事?

就我而言,我需要处理大约一百万行。我批量提交更改。 50. 提交后我应该运行一些命令来更新/重组索引或类似的命令吗?

我使用的是 Oracle 10g。

[编辑]我在这个表中有 969'491 个不同的键,3 种类型和 3 种状态。

最佳答案

如果指定索引提示会发生什么?试试这个:

SELECT /*+ INDEX (demo demo_x04) */ * 
FROM demo
WHERE key = 1
AND type = '003'
AND state = 'NEW';

听起来好像一夜之间发生的事情就是对表格进行了分析。然后,当您对表运行处理时,足够的索引被更新,导致 Oracle 表的统计信息再次过时,优化器停止使用索引。

添加提示并查看 EXPLAIN PLAN 是否为您提供不同的计划并且查询性能更好。

哦,托尼关于分析表的回答是一个普遍的好习惯,尽管 10g 的数据库在这方面进行 self 维护非常好。如果您的进程正在进行大量更新,索引可能很快就会过时。如果当您的进程开始陷入困境时运行分析可以暂时改善情况,那么您就会知道这就是问题所在。

要更新表的统计信息,请使用 dmbs_stats.gather_table_stats包。

例如:

exec dbms_stats.gather_table_stats('所有者','DEMO');

关于oracle - 为什么 Oracle 会忽略 "perfect"索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1734368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com