【问题标题】:Understanding situation with multiple overlapping indexes in oracle了解oracle中多个重叠索引的情况
【发布时间】:2011-03-31 09:35:18
【问题描述】:

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

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

是不是第一个索引是多余的,可以去掉。我们需要解决这个问题,因为这是一张相对较大的桌子,需要不断地敲打。

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

【问题讨论】:

    标签: sql oracle indexing


    【解决方案1】:

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

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

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

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

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

    通过使用subject_x2,每次读取只会为您提供一个代码(并且可能是浪费状态)。这是性能上的巨大差异。

    但是,我不能强调这一点,衡量,不要猜测!

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-14
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      相关资源
      最近更新 更多