Was ist ein "Partial Matching Index"?

27

Ich versuche, mehr über den in SQL Server 2016 eingeführten Abfrageplanoperator "Fremdschlüsselreferenzprüfung" zu erfahren. Es gibt nicht viele Informationen dazu. Microsoft hat es hier angekündigt und ich habe hier darüber gebloggt . Der neue Operator wird angezeigt , indem eine Zeile aus einer übergeordneten Tabelle mit mindestens 254 eingehenden Fremdschlüsselreferenzen gelöscht wird : dbfiddle link .

In den Operator-Details werden drei verschiedene Zählungen angezeigt:

FK überprüfen Details

  • Foreign Key References Count ist die Anzahl der eingehenden Fremdschlüssel.
  • No matching Indexes Count ist die Anzahl der eingehenden Fremdschlüssel ohne geeigneten Index. Um sicherzustellen, dass die aktualisierte oder gelöschte Tabelle diese Einschränkung nicht verletzt, muss eine untergeordnete Tabelle überprüft werden.
  • Ich weiß nicht, was Partial Matching Indexes Count darstellt.

Was ist in diesem Zusammenhang ein partieller Matching-Index? Folgendes konnte ich nicht zum Laufen bringen:

  • Gefilterte Indizes
  • Setzen der Fremdschlüsselspalte als INCLUDESpalte für einen Index
  • Indizes mit der Fremdschlüsselspalte als zweiter Schlüsselspalte
  • Einspaltige Indizes für Fremdschlüssel mit mehreren Spalten
  • Erstellen mehrerer abdeckender Indizes, um einen "Index-Join" -Plan für einen Fremdschlüssel mit mehreren Spalten zu aktivieren

Dan Guzman wies darauf hin, dass Fremdschlüssel mit mehreren Spalten mit Indizes übereinstimmen können, selbst wenn sich die Indexschlüssel in einer anderen Reihenfolge als die Fremdschlüsselspalten befinden. Sein Code ist hier, falls jemand in der Lage ist, ihn als Ausgangspunkt zu verwenden, um mehr über teilweise übereinstimmende Indizes herauszufinden.

Joe Obbish
quelle

Antworten:

13

Ich habe mit Leuten gesprochen, die viel schlauer sind als ich, und wir werden dies bald dokumentieren.

Die eigentliche Definition hierfür ist in der Zwischenzeit:

PartialMatchingIndexCount gibt die Anzahl der Referenzen an, die mithilfe von Indexsuchen überprüft werden konnten, der Indexschlüssel deckt jedoch nicht alle zu überprüfenden Spalten ab. Beispielsweise enthalten die entsprechenden ForeignKeyReferenceCheck-Elemente sowohl ein Seek Predicates- als auch ein Predicate-Element.

Und dazu:

Wenn diese Zahl größer als 0 ist, liegt ein potenzielles Leistungsproblem vor, falls die teilweisen Übereinstimmungen zu einer großen Anzahl von Zeilen führen.

Sean sagt Entfernen Sie Sara Chipps
quelle
6
Ein funktionierendes Beispiel oder eine tatsächliche Dokumentation wäre herrlich. Kopfgeld angeboten
Tom V - Team Monica
3

Nach einigem Nachforschen gelang es mir, einen Beitrag zu verfassen, in dem "Partial Matching Indexes" und Foreign Keys erwähnt werden

Der Blog-Post vom 1. März 2013 im Code-Blog von Carlos Klapp mit dem Titel "Foreign Keys without Indexes Stored Procedure" (Gespeicherte Prozedur) Util_FKsWithoutIndexessucht nach Fremdschlüsseln, für die keine geeigneten Indizes für FK-Beziehungen vorhanden sind. (Dieser Blogger hat dies anscheinend von SQL Server Central übernommen The Ultimate Index-Less Foreign-Key Finder(15. Oktober 2009). ) Im Blog heißt es:

Sucht nach Fremdschlüsseleinschränkungen, die nicht vollständig mit den Indizes übereinstimmen.

Die besten Teil-Matching-Indizes werden mit MatchCounts und Spaltenvergleichen ausgegeben

Generiert eine CREATE INDEX-Vorlage für jeden Fremdschlüssel ohne übereinstimmenden Index oder mit einem teilweise übereinstimmenden Index.

Passen Sie nach Bedarf an (fügen Sie Includes hinzu, wenn Sie möchten, dass es geclustert wird, wenn es Teil des Primärschlüssels sein soll oder wenn Sie mit einem anderen Index zusammenführen möchten).

FKs, bei denen vollständige Übereinstimmungsindizes fehlen, können die Leistung von DELETES in der referenzierten Tabelle aufgrund von Tabellensuchen zur Überprüfung der referenziellen Integrität sowie von SELECTS in den referenzierenden Tabellen, in denen sich die Fremdschlüsselspalten in den WHERE- oder JOIN-Prädikaten befinden, erheblich beeinträchtigen (Dies wirkt sich darauf aus, ob eine Einschränkung vorliegt oder nicht). Dadurch werden nur die ersten N Spalten des Index überprüft, wobei N die Anzahl der Spalten in der Fremdschlüsseleinschränkung ist.

Die Reihenfolge der Indexspalten wird darüber hinaus nicht überprüft. (Ein zweispaltiger FK mit einer übereinstimmenden Spalte in der zweiten Spalte eines dreiteiligen Index wird als Teilübereinstimmung ausgegeben.)

Wenn Ihre Datenbank keine Fremdschlüsseleinschränkungen enthält, ist dieses Tool für Sie wertlos.

Viele Datenbanken verfügen über eine teilweise Abdeckung von Fremdschlüsseleinschränkungen. Dies funktioniert nur für verknüpfte Tabellen, in denen Einschränkungen deklariert sind.

Wenn ich das richtig verstehe und eine FK-Beziehung nicht über einen Index verfügt, der mit jeder Spalte in einem erforderlichen Index übereinstimmt, gibt es möglicherweise einige Indizes, die einige der Spalten enthalten. Wenn zum Beispiel eine FK Beziehung hat drei Spalten ( a, b, c) , aber es gibt keinen Index mit den gleichen drei Spalten, kann es einen Index gibt , die (hat a, b) oder ( a, c) oder ( b, c) und bei Fragen helfen können , aber wird erfordern einige Index-Scans zu Zeilen mit der fehlenden Spalte.

Wenn es überhaupt keine Indizes gibt, die eine FK-Einschränkung unterstützen können, ist die "Partial Matching Indexes Count" Null ( 0) oder erhöht diese Anzahl zumindest nicht.

RolandoMySQLDBA
quelle
Ist es das, was du im Sinn hattest? Kann es immer noch nicht zum Laufen bringen
Joe Obbish
Nicht genau. Versuchen Sie, eine FK mit zu (FKey2,FKey3)erstellen und einen Index für zu erstellen FKey2. Bitte versuchen Sie das.
RolandoMySQLDBA
Denken Sie daran, ich bin kein SQL Server-Typ, aber ich versuche nur zu helfen.
RolandoMySQLDBA
Ich verstehe und schätze alle Ideen zu versuchen. Ich kann die zwei Spalten auch nicht zum Laufen bringen.
Joe Obbish
Sie könnten einen Graben ziehen create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), den Index beibehalten FKey2und es erneut versuchen.
RolandoMySQLDBA