【发布时间】:2011-03-31 09:35:18
【问题描述】:
给定 Oracle 数据库的以下索引:
CREATE INDEX subject_x1 ON subject (code);
CREATE INDEX subject_x2 ON subject (code, status);
是不是第一个索引是多余的,可以去掉。我们需要解决这个问题,因为这是一张相对较大的桌子,需要不断地敲打。
任何解释或确认这一点的 oracle 文档都会非常有帮助。
【问题讨论】:
给定 Oracle 数据库的以下索引:
CREATE INDEX subject_x1 ON subject (code);
CREATE INDEX subject_x2 ON subject (code, status);
是不是第一个索引是多余的,可以去掉。我们需要解决这个问题,因为这是一张相对较大的桌子,需要不断地敲打。
任何解释或确认这一点的 oracle 文档都会非常有帮助。
【问题讨论】:
与大多数数据库问题一样,这取决于:-)
事实上,在所有情况下都不应该删除它。如果您有一个在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 在某些查询中为您提供了更好的性能,请将其保留。它会影响更新/插入速度和存储要求,但您会发现这通常无关紧要,因为:
【讨论】: