![具有不同包含内容的多个 SQL Server 唯一索引](https://linux22.com/image/549152/%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E5%8C%85%E5%90%AB%E5%86%85%E5%AE%B9%E7%9A%84%E5%A4%9A%E4%B8%AA%20SQL%20Server%20%E5%94%AF%E4%B8%80%E7%B4%A2%E5%BC%95.png)
在 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
我不确定具体场景会如何展开,但你应该能够毫不费力地进行测试。
在开发环境中(如果存在)尝试运行两种场景的查询并检查执行计划。如果第二个索引可以防止表扫描之类的事情发生,那么很有可能值得这样做。如果您发现第一个索引确实在做所有工作,那么可能就不值得了。
除了常见的索引问题之外,我没发现索引有什么重大缺点。如果你开始添加太多索引,你的插入、更新和删除操作可能会开始变慢,还会占用更多磁盘空间。