了解oracle中多个重叠索引的情况

时间:2010-08-18 07:13:27

标签: sql oracle indexing

给出Oracle数据库的以下索引:

CREATE INDEX subject_x1 ON subject (code);
CREATE INDEX subject_x2 ON subject (code, status);

第一个索引是多余的,可以删除。我们需要做到这一点,因为这是一个相对较大的桌子,将不断受到重创。

任何解释或确认这一点的oracle文档都会非常有用。

1 个答案:

答案 0 :(得分:12)

与大多数数据库问题一样,它取决于: - )

实际上,不应该在所有情况下删除它。如果您的查询在code子句中单独使用where,那么subject_x1的使用可能仅仅因为索引较少而仍然优于subject_x2需要读入数据。

一个极端的例子,假设codechar(2)status是char(4094)`。如果您有查询:

select code from tbl where code > 'dd' and code < 'gg';

这最有可能导致仅索引扫描,因为绝对没有理由去表。如果您使用subject_x1并从索引中读取4K块,则每次读取时都会引入几千个代码。

通过使用subject_x2,每个只读给你一个代码(可能是浪费状态)。这是性能上的巨大差异。

然而,我不能强调这一点,衡量,不要猜测!

使用两个索引来描述您的查询(和更新)以查看哪个表现更好,并使用代表性数据进行。如果您发现subject_x1为某些查询提供了更好的性能,请将其保留。它会影响更新/插入速度和存储要求,但您会发现这通常不重要,因为:

  • 绝大多数数据库的阅读频率远高于书面数据;和
  • 关于数据库的大多数抱怨都与速度而不是存储空间有关。