这是SQL Server中以下示例中的冗余索引

时间:2018-03-05 12:25:56

标签: sql-server tsql database-indexes

我在下面列出了一些索引

  • 索引A(列1,列2)
  • IndexB(列1,列2,栏3,Column4,Column5)
  • IndexC(列2,栏3)
  • IndexD(column1的,栏3)
  • IndexE(column1的,Column4)

在这里,我认为重复索引是IndexA。 但在阅读了一些互联网博客后,我发现IndexD,IndexE和IndexA都是多余的。

3 个答案:

答案 0 :(得分:2)

这取决于您的查询模式。

如果你只检查col1,col2上的相等性,则索引A是多余的。当然我可以删除索引A,因为它可以满足的所有查询都满足索引B ..

索引B可能有用的情况很少,下面是一个例子

 select col1,col2 from tbl where
   col1=someval and col2>someval

其他索引对于少数类型的查询更有效。同时您不能拥有通用索引,您必须查询并查看哪个索引对该查询有帮助,并根据该索引创建索引

答案 1 :(得分:1)

  • IndexA:if not unique
  • IndexD,IndexE:可能

如果任何索引是唯一的,那么它就不能归入更广泛的重叠索引,因为唯一性会丢失。

如果过滤了任何索引,那么它可能不会被包含。

在您的示例中,只有IndexA可能重叠,除非用于唯一性。

IndexD和IndexE可能是,它取决于选择性和查询模式
如果可能将这些作为(Column3,Column1)和(Column4,Column1)或一个组合索引,或删除它们并使用sp_blitzindex来查找更多

还有更多选择。例如,重新排序IndexB或计算出可能是简单的INCLUDE

答案 2 :(得分:0)

根据Column1和Column2的选择性,您可以通过在IndexA上将Column3,Column4和Column5添加为包含的列来使IndexB冗余。在某些情况下,特别是索引将包含大量非叶页的情况,这将提供更好的性能,因为包含的列将仅存储在叶页上。