例如:

Given columns A,B,C,D,

IX_A is an index on 'A'

IX_AB is a covering index on 'AB'

IX_A可以安全地移除,因为它是多余的:将IX_AB在其位置上使用。 我想知道,如果这概括:

如果我有:

IX_AB
IX_ABC
IX_ABCD

和等等,

可以较小的指数仍然可安全删除? 即,确实IX_ABC使IX_AB冗余的,并且确实IX_ABCD使双方IX_AB和IX_ABC冗余?

有帮助吗?

解决方案

在一般 - 这从服务器变化到服务器 - 覆盖索引将覆盖索引的较小的选择

因此,如果你具有覆盖A,B,C,通常自动提供覆盖一个的索引的索引,以及a,b。

您不保证有,例如,B的覆盖索引,C。

其他提示

是,在大多数情况下。

然而,IX_ABCD并不像,比如说一个更换,IX_BCD。

非常有帮助

有一个警告,但是:索引可能仍然需要磁盘读取,因此,如果C和d爆炸索引的大小,会出现在IX_ABCD仰视A,B一些低效率看时它会发生不向上在IX_AB。

然而,该差异可能是由分别保持IX_AB的附加性能损失抵消。

重要的是在索引的前导列。如果你有索引IX_ABCD以下查询将使用索引:

从表中选择*,其中A = 1

SELECT * FROM表,其中A = 1和B = 1

SELECT * FROM表,其中A = 1和B = 1,C = 1

然而,下面将最有可能不使用索引(至少你不打算如何):

SELECT * FROM表,其中B = 1

SELECT * FROM表,其中C = 1

SELECT * FROM表,其中B = 1和C = 1

重要的是,导致柱。因此,列被创建索引时的顺序很重要。

不一定。虽然是真实的,关于(A,B,C)可被使用于在一个过滤谓词或上的一个定货请求或在连接条件的索引,这并不必然意味着该索引(A)单独是没有用的。如果在(A,B,C)中的索引是相当更宽比(A),然后在单独的A范围扫描将节省显著I / O,因为它必须读取页数较少(较窄索引)。

UT我admint,这将是例外,而不是规律。通常是安全的,如果在另一个(A,B)的存在是为了对甲删除一个索引。请注意,在一个索引(A,B)不满足上乙任何过滤如此,是安全的,如果最左边的列(多个)是相同的,只除去。一些数据库具有“跳跃扫描”,可以在(A,B)使用索引用于查找乙运营商,但是这是一个非常窄边框的情况。

总是最好不要承担有关数据库引擎内部任何东西,实际检查正在使用的实际查询计划。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top