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

运算符详细信息中显示了三个不同的计数:输入的外键数量。

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

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


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

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

#1 楼

我跟人说的比我聪明得多,我们会尽快记录下来。

此期间的实际定义是:


PartialMatchingIndexCount反映了可以使用索引查找来检查的引用的数量,但是索引键不能覆盖所有要检查的
列。例如,相应的
ForeignKeyReferenceCheck元素包含一个Seek谓词和一个
谓词元素。


另外:


/>如果此数字大于0,则可能存在性能问题,以防部分匹配导致大量行。


评论


一个有效的示例或实际文档将是光荣的。提供赏金

–汤姆五世
17年12月20日在20:07

#2 楼

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

卡洛斯·克拉普(Carlos Klapp)的代码博客2013年3月1日的博客文章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性能,这是因为用于检查参照完整性的表扫描以及在外键列所在的引用表上的SELECTS WHERE或JOIN谓词(这将影响您是否存在约束)。
仅检查前N个colu索引的mns,其中N是外键约束中的列数。 3-col索引将作为部分匹配输出)

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

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


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

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

评论


这就是您的想法吗?仍然无法正常工作...dbfiddle.uk/…

– Joe Obbish
17年12月15日在22:10

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

– RolandoMySQLDBA
17/12/15在22:20



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

– RolandoMySQLDBA
17年12月15日在22:22

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

– Joe Obbish
17年12月15日在22:25

您可以放弃在FK_PARENT_TABLE上创建唯一索引FULL_IX_UNIQUE(FKey,Fkey2,Fkey3),将索引保留在FKey2上,然后重试。

– RolandoMySQLDBA
17年12月15日在22:28