什么是“部分匹配指数”?


27

我试图了解有关SQL Server 2016中引入的“外键引用检查”查询计划运算符的更多信息。那里没有很多有关它的信息。微软在这里宣布了它,我在这里发表了博客。通过从具有254个或更多传入外键引用的父表中删除一行,可以看到new运算符:dbfiddle link

操作员详细信息中显示三种不同的计数:

FK检查详细信息

  • 外键引用计数是传入外键的数量。
  • 没有匹配的索引计数是没有合适索引的传入外键的数量。验证更新或删除的表不会违反该约束将需要对子表进行扫描。
  • 我不知道部分匹配索引计数代表什么。

在这种情况下,什么是部分匹配索引?我无法进行以下任何工作:

  • 筛选索引
  • 将外键列作为INCLUDE索引的列
  • 使用外键列作为第二个键列的索引
  • 多列外键的单列索引
  • 创建多个覆盖索引以为多列外键启用“索引连接”计划

Dan Guzman指出,即使索引键的顺序与外键列的顺序不同,多个列的外键也可以匹配索引。他的代码是在这里,以防有人能够以它为起点来进一步了解部分匹配索引。

Answers:


13

我与比我聪明得多的人交谈,我们将尽快对此进行记录™。

在此期间的实际定义是:

PartialMatchingIndexCount反映可以使用索引查找来检查的引用数,但索引键并不覆盖所有要检查的列。例如,相应的ForeignKeyReferenceCheck元素同时包含Seek谓词和Predicate元素。

此外:

如果此数字大于0,则在部分匹配导致大量行的情况下,可能会出现性能问题。


6
一个有效的示例或实际文档将是光荣的。提供赏金
汤姆五世-莫妮卡团队

3

经过更多的谷歌搜索之后,我设法提出了一篇提到“部分匹配索引”和外键的文章

2013年3月1日的博客文章,卡洛斯科拉普的Code博客有权Foreign Keys without Indexes有存储过程调用Util_FKsWithoutIndexes看起来对于不具有FK关系正确的索引外键。(看起来像这个博客作者从SQL Server Central的The Ultimate Index-Less Foreign-Key Finder(2009年10月15日)取消了此内容。)该博客说:

搜索没有完全匹配的索引的外键约束。

最佳的部分匹配索引与MatchCounts和列比较一起输出

为每个没有匹配索引或部分匹配索引的外键生成一个CREATE INDEX模板。

根据需要进行定制(添加包括,如果您希望将其集群,或者它应该是主键的一部分,或者如果您想与另一个索引合并)

缺少完全匹配索引的FK可能会严重损害被引用表上的DELETES性能,这是因为用于检查参照完整性的表扫描以及外键列在WHERE或JOIN谓词中的参照表上的SELECTS (这将影响您是否存在约束)。这仅检查索引的前N列,其中N是外键约束中的列数。

超出此范围的索引列顺序未得到验证(3列索引的第二列中具有1个匹配列的2列FK将作为部分匹配输出)

如果您的数据库没有外键约束,那么此工具对您将毫无价值。

许多数据库具有部分外键约束范围。这仅适用于声明了约束的相关表。

如果我正确理解这一点,如果FK关系中没有一个索引与某个所需索引中的每一列相匹配,则可能有些索引具有某些列。例如,如果一个FK关系有三列(abc),但与那些相同的三列没有索引,可能存在有(索引ab)或(ac)或(bc)和可查询的帮助,但会需要对缺少列的行进行一些索引扫描。

如果根本没有任何索引可以支持FK约束,则“部分匹配索引计数”将为零(0),或者至少不会增加该计数。


这就是您的想法吗?仍然无法得到它的工作... dbfiddle.uk/...
乔Obbish

不完全是。尝试使用(FKey2,FKey3)创建FK 并在上创建索引FKey2。请尝试一下。
RolandoMySQLDBA

请记住,我不是SQL Server专家,但我只是在尝试提供帮助。
RolandoMySQLDBA '17

我理解并赞赏任何尝试的想法。我也无法使两列都起作用。
Joe Obbish

您可以放弃create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3),保留索引,FKey2然后重试。
RolandoMySQLDBA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.