具有不同包含内容的多个 SQL Server 唯一索引

具有不同包含内容的多个 SQL Server 唯一索引

在 SQL Server 中,假设我有一个非常大的表(列 A 到 Z),该表在 A 上有一个 CLUSTERED PRIMARY KEY,在列 B、C、D 上有一个 UNIQUE NONCLUSTERED 索引 IX1,包括 E、F、G。然后,我需要用在 D、C、B 上的新 NONCLUSTERED 索引 IX2 覆盖另一个查询,包括 J、K、M。

IX1 已在 B、C、D 之间强制执行唯一性,那么创建 IX2 UNIQUE 是否也有意义?是否存在任何重大利弊。

答案1

如果您的索引是唯一的,那么请告诉 SQL 它是唯一的。优化器可以使用附加信息,这样做没有任何坏处。

话虽如此,您真的需要第二个索引吗?其他查询使用的键的顺序是否不同?如果不是,为什么不直接将额外的包含列添加到第一个索引,从长远来看,这可能会更便宜。

答案2

我不确定具体场景会如何展开,但你应该能够毫不费力地进行测试。

在开发环境中(如果存在)尝试运行两种场景的查询并检查执行计划。如果第二个索引可以防止表扫描之类的事情发生,那么很有可能值得这样做。如果您发现第一个索引确实在做所有工作,那么可能就不值得了。

除了常见的索引问题之外,我没发现索引有什么重大缺点。如果你开始添加太多索引,你的插入、更新和删除操作可能会开始变慢,还会占用更多磁盘空间。

相关内容