Che cos'è un "indice di corrispondenza parziale"?


27

Sto cercando di saperne di più sull'operatore del piano di query "Controllo riferimenti a chiave esterna" introdotto in SQL Server 2016. Non ci sono molte informazioni al riguardo. Microsoft l'ha annunciato qui e ne ho fatto un blog qui . Il nuovo operatore può essere visualizzato eliminando una riga da una tabella padre con 254 o più riferimenti di chiave esterna in entrata: collegamento dbfiddle .

Esistono tre diversi conteggi visualizzati nei dettagli dell'operatore:

Dettagli controllo FK

  • Riferimenti di chiave esterna Conteggio è il numero di chiavi esterne in entrata.
  • Nessun conteggio di indici corrispondente corrisponde al numero di chiavi esterne in entrata senza un indice adatto. La verifica che la tabella aggiornata o eliminata non violi tale vincolo richiederà una scansione di una tabella figlio.
  • Non so cosa rappresenti il conteggio degli indici di corrispondenza parziale .

Che cos'è un indice di corrispondenza parziale in questo contesto? Non sono riuscito a ottenere nessuna delle seguenti funzioni:

  • Indici filtrati
  • Inserimento della colonna chiave esterna come INCLUDEcolonna per un indice
  • Indici con la colonna chiave esterna come seconda colonna chiave
  • Indici a colonna singola per chiavi esterne a più colonne
  • Creazione di più indici di copertura per abilitare un piano di "join indice" per una chiave esterna a più colonne

Dan Guzman ha sottolineato che le chiavi esterne a più colonne possono corrispondere agli indici anche se le chiavi dell'indice sono in un ordine diverso rispetto alle colonne della chiave esterna. Il suo codice è qui nel caso in cui qualcuno sia in grado di usarlo come punto di partenza per capire di più sugli indici di corrispondenza parziale.

Risposte:


13

Ho parlato con persone molto più intelligenti di me e lo documenteremo presto ™.

La definizione effettiva di questo, nel frattempo, è:

PartialMatchingIndexCount riflette il numero di riferimenti che è possibile verificare utilizzando le ricerche dell'indice, ma la chiave dell'indice non copre tutte le colonne da controllare. Ad esempio, gli elementi ForeignKeyReferenceCheck corrispondenti contengono sia un elemento Predicate di ricerca che un elemento Predicato.

Inoltre:

Se questo numero è maggiore di 0, esiste un potenziale problema di prestazioni, nel caso in cui le corrispondenze parziali generino un numero elevato di righe.


6
Un esempio funzionante o una documentazione reale sarebbe glorioso. Bounty offerto
Tom V - Team Monica

3

Dopo alcuni altri googling, sono riuscito a trovare un post che menziona "Indici di corrispondenza parziale" e chiavi esterne

Il post del blog del 1 ° marzo 2013 nel blog del codice di Carlos Klapp intitolatoForeign Keys without Indexes Stored procedure chiamato Util_FKsWithoutIndexesche cerca chiavi esterne che non hanno indici adeguati per le relazioni FK. (Sembra che questo blogger lo abbia rimosso da SQL Server Central The Ultimate Index-Less Foreign-Key Finder(15 ottobre 2009) ) Il blog dice quanto segue:

Cerca i vincoli di chiave esterna che non hanno indici completamente corrispondenti.

I migliori indici di corrispondenza parziale vengono emessi con MatchCounts e confronti di colonne

Genera un modello CREATE INDEX per ogni chiave esterna senza indice di corrispondenza o indice di corrispondenza parziale.

Personalizza secondo necessità (aggiungi include, se vuoi che sia raggruppato, o se dovrebbe far parte della chiave primaria, o se desideri unire un altro indice)

Gli FK che mancano di indici di corrispondenza completi possono danneggiare gravemente le prestazioni di DELETES sulla tabella di riferimento a causa di scansioni di tabelle per il controllo dell'integrità referenziale, nonché SELECTS nelle tabelle di riferimento in cui le colonne di chiavi esterne si trovano nei predicati WHERE o JOIN (Ciò influirà sull'esistenza o meno di un vincolo). Questo controlla solo le prime N colonne dell'indice in cui N è il numero di colonne nel vincolo di chiave esterna.

L'ordine delle colonne dell'indice non viene verificato oltre questo (un FK a due colonne che ha 1 colonna corrispondente nella seconda colonna di un indice a 3 colonne verrà emesso come una corrispondenza parziale)

Se il tuo database non ha vincoli di chiave esterna, questo strumento sarà inutile per te.

Molti database hanno una copertura parziale dei vincoli di chiave esterna. Funziona solo su tabelle correlate in cui vengono dichiarati i vincoli.

Se lo capisco correttamente, se una relazione FK non ha un indice che corrisponde a ogni colonna in un indice necessario, potrebbero esserci alcuni indici che hanno alcune delle colonne. Ad esempio, se un rapporto FK ha tre colonne ( a, b, c), ma non v'è alcun indice con quelle stesse tre colonne, può essere previsto un indice che ha ( a, b) o ( a, c) o ( b, c) e possono aiutare con domande ma richiede alcune scansioni dell'indice nelle righe con la colonna mancante.

Se non ci sono indici in grado di supportare un vincolo FK, il "Conteggio degli indici di corrispondenza parziale" sarà zero ( 0) o almeno non aumenterà questo conteggio.


È questo che avevi in ​​mente? Non riesco ancora a farlo funzionare ... dbfiddle.uk/…
Joe Obbish il

Non esattamente. Prova a creare un FK con (FKey2,FKey3)e crea un indice su FKey2. Per favore, prova questo.
RolandoMySQLDBA il

Ricorda che non sono un tipo di SQL Server, ma sto solo cercando di aiutarti.
RolandoMySQLDBA,

Capisco e apprezzo qualsiasi idea da provare. Inoltre non riesco a far funzionare la colonna due.
Joe Obbish,

Potresti abbandonare create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), tenere acceso l'indice FKey2e riprovare.
RolandoMySQLDBA,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.