具有多列的索引是否会使类似的索引变得多余?

Roc*_*lan 6 index sql-server index-tuning

假设我有一个看起来像这样的表:

CREATE TABLE Activity (
    ActivityID int primary key identity(1,1) ,
    ActivityName nvarchar(10),
    InactiveFlag bit
)
Run Code Online (Sandbox Code Playgroud)

具有如下所示的索引:

CREATE INDEX Activity_Index on Activity 
( 
    ActivityName
)
Run Code Online (Sandbox Code Playgroud)

然后出于某种原因,有人创建了第二个索引:

CREATE INDEX Another_Activity_Index on Activity 
( 
    ActivityName, InactiveFlag
)
Run Code Online (Sandbox Code Playgroud)

删除第一个索引绝对安全吗?它只是占用了不必要的磁盘空间吗?第二个索引会覆盖第一个索引的所有情况吗?列排序绝对是“ActivityName”第一。

Aar*_*and 9

在这种情况下,我认为第一个索引是多余的(而且不太有用)。请注意,删除索引将使引用它的任何计划无效,因此下次运行任何这些查询时,由于需要重新编译才能访问第二个索引,因此您可能会看到性能下降。虽然两个索引都存在,但任何只需要对 ActivityName 进行操作的查询都可能会选择第一个索引,因为它更薄。

如果第二个索引中的第二列更宽一些,那么我对删除第一个索引的建议可能就不那么傲慢了。varchar例如,如果该列是宽的,那么在必要时(并且当varchar不需要该列进行输出或过滤时)使用索引所需的额外 I/O实际上会生成第一个索引(即使它在技术上是多余的)更希望满足这种类型的查询。

所以,只是一种冗长的说法:这取决于。:-)