什麼是“部分匹配指數”?
我正在嘗試了解有關 SQL Server 2016 中引入的“外鍵引用檢查”查詢計劃運算符的更多資訊。關於它的資訊並不多。微軟在這裡宣布了它,我在這裡寫了一篇部落格。可以通過從具有 254 個或更多傳入外鍵引用的父表中刪除一行來看到新運算符:dbfiddle link。
運營商詳細資訊中顯示了三種不同的計數:
- 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
),或者至少不會增加該計數。