我使用 , 运行了一个查询sys.dm_db_missing_index_details
,sys.dm_db_missing_index_groups
并sys.dm_db_missing_index_group_stats
确定我对丢失索引的选择是什么。在分析数据后,我确定我需要为表 A 创建一个非聚集索引。
查看表 A,我注意到有 55 个依赖项(表、SP、视图)和 23 个依赖于该表的对象。我的问题是,如果我在这个表上创建这个非聚集索引,它会影响这个表的依赖项和依赖项吗?
此外,如果是的话,它会影响依赖关系,我什至如何尝试修复依赖关系?
实现过滤索引时,某些连接设置必须正确:
否则
因此,如果任何依赖代码没有正确配置上述
SET
选项,添加过滤索引将破坏它们。不幸的是,在使用有问题的存储过程代码的旧系统上工作时,我不得不学习一种艰难的方法来仔细检查这一点:)在可用的索引类型中,我只能看到一种能够导致依赖于表的对象出错的索引,它是唯一索引。
根据唯一索引设计指南:
它是一个带有约束的索引,可确保值是唯一的。除了那种非常具体的情况,你不必担心打破依赖,正如文档所说,
如您所见,非聚集索引与表分离,不会改变表本身的结构,因此,使用该表的任何内容都不会受到您害怕的负面影响。
这是一个很好的起点:SQL Server 索引体系结构和设计指南
实验室:通过创建索引导致表依赖错误
首先,创建一个表,该表将有一个依赖于它的对象:
现在,创建一个依赖于该表的 SP:
让我们插入用户Paul Smith:
该过程执行良好。Paul 是一个非常常见的名称,现在您可以根据需要插入尽可能多的名为 Paul 的用户。但是您决定在列名称上创建一个唯一索引:
之后,您尝试插入另一个名为Paul Jones的用户:
但是现在你得到一个错误:
依赖于该表的 SP 现在已损坏。这是我能想象的唯一一种情况,您可以通过创建索引来破坏依赖于表的对象。如果您现在不创建唯一索引,则可以放松并观察新索引的性能。
非常简单的答案是否定的。但是,在创建索引之前,您必须了解工作量,表上当前有多少索引,是否可以通过修改现有索引来完成新索引等。
切勿根据 SQL Server 缺失索引建议创建索引https://www.brentozar.com/archive/2017/08/missing-index-recommendations-arent-perfect/
正如我在第 1 段中提到的,您需要通过分析使用统计数据来了解您的工作量和新索引的好处。