冗余索引

时间:2017-05-03 08:00:19

标签: sql sql-server database

我有一个包含以下三个索引的表:

索引编号1:

CREATE NONCLUSTERED INDEX [IDX_1] 
     ON [dbo].[TABLE] ([A] ASC, [B] ASC, [C] ASC)

索引编号2:

CREATE NONCLUSTERED INDEX [IDX_2] 
    ON [dbo].[TABLE] ([A] ASC, [B] ASC) 

索引编号3:

CREATE NONCLUSTERED INDEX [IDX_3] 
    ON [dbo].[TABLE] ([C] ASC, [B] ASC, [A] ASC)

如果我的谦虚理解是正确的,那么以下是:

  1. 我可以删除IDX_2,因为IDX_1完全包含在IDX_1中(同一列中的相同列)。

  2. IDX_3IDX_1不一样。 A可用于针对列A的查询,也可用于针对列B和列IDX_3的查询。另一方面,C可用于针对列C或列BA, B, C的查询。这两个索引对于针对所有三列IDX_2的查询都是有用的。

  3. IDX_3IDX_1涵盖A。对于列A或列BIDX_2 IDX_3的查询将被使用,并且可以使用针对所有三列IDX_1的查询。因此,删除user

  4. 是安全的

    提前致谢, 马尔特

1 个答案:

答案 0 :(得分:3)

在你的所有问题中,我会删除idx_2,因为Indx_1

是多余的

对于问题2和3,其中包含以下索引,如果您的查询遵循以下某些特定模式,则它们不是多余的

  indx-2    CREATE NONCLUSTERED INDEX [IDX_1] ON [dbo].[TABLE] (
              [A] ASC,
              [B] ASC,
              [C] ASC)



  indx-3       CREATE NONCLUSTERED INDEX [IDX_3] ON [dbo].[TABLE] (
              [C] ASC,
              [B] ASC,
              [A] ASC)

下面的查询可以有效地使用indx2,但不能使用index3

select a,b,c from table where a=20 and b=40 and c>40

下面的查询可以有效地使用index3,但index2没有多大帮助

select a,b,c from table where c=20 and b=40 and a>90

如果您的查询不遵循此模式,并且如果他们所做的只是搜索相等,那么其中一个是多余的