我正在阅读有关重复索引的文档。在示例中,它显示了Left子集重复索引,它建议的是,如果我有如下所示的索引,我应该考虑从索引中删除TransRefId字段,因为Sql server将始终使用第一个索引。
有人能解释一下背后的逻辑吗?
Index1 [DATAAREAID],[ITEMID],[DATESTATUS]
Index2 [DATAAREAID],[ITEMID],[DATESTATUS],[TRANSREFID] *
答案 0 :(得分:0)
我会说相反的。也就是说,给定您已定义的两个索引,第一个可以满足的所有查询都可以被第二个满足,但相反的情况则不然。也就是说,如果你有一个带有谓词的where子句,所有[DATAAREAID],[ITEMID],[DATESTATUS]和[TRANSREFID],则第一个索引将[TRANSFERID]作为残差谓词(即可以'被寻求)并且将必须评估前三个匹配的所有行,以查看第四个是否匹配。
现在,也就是说,可能存在两个索引都有意义的情况!考虑通过使用第二个索引来正常处理普通OLTP工作负载的情况,但它是一个宽索引。您还有一个不经常运行但时间紧迫的过程,它可以使用第一个索引,如果没有第四列,则该索引很窄。索引是一种艺术。