Sql-Server

什麼是“部分匹配指數”?

  • December 20, 2017

我正在嘗試了解有關 SQL Server 2016 中引入的“外鍵引用檢查”查詢計劃運算符的更多資訊。關於它的資訊並不多。微軟在這裡宣布了它,我在這裡寫了一篇部落格。可以通過從具有 254 個或更多傳入外鍵引用的父表中刪除一行來看到新運算符:dbfiddle link

運營商詳細資訊中顯示了三種不同的計數:

FK 查看詳情

  • Foreign Key References Count是傳入外鍵的數量。
  • No matching Indexes Count是沒有合適索引的傳入外鍵數。驗證更新或刪除的表不會違反該約束將需要掃描子表。
  • 我不知道部分匹配索引計數代表什麼。

在這種情況下,什麼是部分匹配索引?我無法使以下任何一項工作:

  • 過濾索引
  • 將外鍵列作為INCLUDE索引列
  • 以外鍵列作為第二鍵列的索引
  • 多列外鍵的單列索引
  • 創建多個覆蓋索引以啟用多列外鍵的“索引連接”計劃

Dan Guzman指出,即使索引鍵與外鍵列的順序不同,多列外鍵也可以匹配索引。他的程式碼在這裡,以防有人能夠使用它作為起點來找出更多關於部分匹配索引的資訊。

我與比我聰明得多的人交談,我們將很快記錄下來™。

在此期間的實際定義是:

PartialMatchingIndexCount 反映了可以使用索引查找檢查的引用數,但索引鍵並不涵蓋所有正在檢查的列。例如,對應的 ForeignKeyReferenceCheck 元素同時包含一個 Seek Predicates 和一個 Predicate 元素。

此外:

如果此數字大於 0,則存在潛在的性能問題,以防部分匹配導致大量行。

經過一番Google搜尋後,我設法想出了一篇提到“部分匹配索引”和外鍵的文章

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 性能,因為用於檢查引用完整性的表掃描以及外鍵列在 WHERE 或 JOIN 謂詞中的引用表上的 SELECTS (這將影響您是否存在約束)。這僅檢查索引的前 N ​​列,其中 N 是外鍵約束中的列數。

索引列順序未驗證超出此範圍(在 3-col 索引的第 2 列中具有 1 個匹配列的 2-col FK 將作為部分匹配輸出)

如果你的數據庫沒有外鍵約束,那麼這個工具對你來說毫無價值。

許多數據庫具有部分外鍵約束覆蓋。這僅適用於聲明了約束的相關表。

如果我理解正確,如果 FK 關係沒有與某些所需索引中的每一列匹配的索引,則可能有一些索引具有某些列。例如,如果 FK 關係具有三列 ( a, b, c),但沒有具有這三列的索引,則可能存在具有 ( a, b) 或 ( a, c) 或 ( b, c) 的索引,並且可能有助於查詢但會需要對缺少列的行進行一些索引掃描。

如果根本沒有索引可以支持 FK 約束,那麼“部分匹配索引計數”將為零 ( 0),或者至少不會增加該計數。

引用自:https://dba.stackexchange.com/questions/192526