Qu'est-ce qu'un «indice de correspondance partielle»?

27

J'essaie d'en savoir plus sur l'opérateur de plan de requête «vérification des références de clés étrangères» introduit dans SQL Server 2016. Il n'y a pas beaucoup d'informations à ce sujet. Microsoft l'a annoncé ici et j'ai blogué à ce sujet ici . Le nouvel opérateur peut être vu en supprimant une ligne d'une table parent avec 254 références de clés étrangères entrantes ou plus: lien dbfiddle .

Il y a trois nombres différents affichés dans les détails de l'opérateur:

Détails du contrôle FK

  • Le nombre de références de clés étrangères est le nombre de clés étrangères entrantes.
  • Aucun index correspondant ne correspond au nombre de clés étrangères entrantes sans index approprié. Pour vérifier que la table mise à jour ou supprimée ne violera pas cette contrainte, il faudra analyser une table enfant.
  • Je ne sais pas ce que représente le nombre d' index de correspondance partielle .

Qu'est-ce qu'un index d'appariement partiel dans ce contexte? Je n'ai pas réussi à faire fonctionner les éléments suivants:

  • Index filtrés
  • Mettre la colonne de clé étrangère en tant que INCLUDEcolonne pour un index
  • Index avec la colonne de clé étrangère comme deuxième colonne de clé
  • Index à colonne unique pour clés étrangères à plusieurs colonnes
  • Création de plusieurs index de couverture pour activer un plan de "jointure d'index" pour une clé étrangère à plusieurs colonnes

Dan Guzman a souligné que les clés étrangères à plusieurs colonnes peuvent correspondre aux index même si les clés d'index sont dans un ordre différent de celui des colonnes de clés étrangères. Son code est au cas où quelqu'un pourrait l'utiliser comme point de départ pour en savoir plus sur les index de correspondance partielle.

Joe Obbish
la source

Réponses:

13

J'ai parlé à des gens beaucoup plus intelligents que moi et nous documenterons cela bientôt ™.

La définition réelle de ceci, dans l'intervalle, est:

PartialMatchingIndexCount reflète le nombre de références pouvant être vérifiées à l'aide de recherches d'index, mais la clé d'index ne couvre pas toutes les colonnes vérifiées. Par exemple, les éléments ForeignKeyReferenceCheck correspondants contiennent à la fois un prédicat de recherche et un élément de prédicat.

En plus:

Si ce nombre est supérieur à 0, il existe un problème de performances potentiel, au cas où les correspondances partielles entraîneraient un grand nombre de lignes.

Sean dit de retirer Sara Chipps
la source
6
Un exemple de travail ou une documentation réelle serait glorieux. Bounty offert
Tom V - Team Monica
3

Après un peu plus de recherche sur Google, j'ai réussi à trouver un article qui mentionne les "indices de correspondance partielle" et les clés étrangères

Le billet de blog du 1er mars 2013 dans le blog de code de Carlos Klapp intituléForeign Keys without Indexes a la procédure stockée appelée Util_FKsWithoutIndexesqui recherche les clés étrangères qui n'ont pas d'index appropriés pour les relations FK. (On dirait que ce blogueur a retiré cela de SQL Server Central The Ultimate Index-Less Foreign-Key Finder(15 octobre 2009) ) Le blog dit ce qui suit:

Recherche les contraintes de clé étrangère qui n'ont pas d'index entièrement correspondants.

Les meilleurs index de correspondance partielle sont générés avec des MatchCounts et des comparaisons de colonnes

Génère un modèle CREATE INDEX pour chaque clé étrangère sans index correspondant ou index correspondant partiellement.

Personnalisez selon les besoins (ajoutez des inclusions, si vous voulez qu'il soit en cluster, ou s'il doit faire partie de la clé primaire, ou si vous voulez fusionner avec un autre index)

Les FK manquant des index de correspondance complets peuvent gravement nuire aux performances de DELETES sur la table référencée en raison des analyses de table pour vérifier l'intégrité référentielle, ainsi que de SELECTS sur les tables de référence où les colonnes de clé étrangère se trouvent dans les prédicats WHERE ou JOIN (Cela vous affectera si une contrainte existe ou non). Cela vérifie uniquement les N premières colonnes de l'index où N est le nombre de colonnes dans la contrainte de clé étrangère.

L'ordre des colonnes d'index n'est pas vérifié au-delà de cela (un FK à deux cols qui a 1 colonne correspondante dans le 2e col d'un index à 3 cols sera sorti comme une correspondance partielle)

Si votre base de données n'a aucune contrainte de clé étrangère, cet outil ne vous sera d'aucune utilité.

De nombreuses bases de données ont une couverture partielle des contraintes de clé étrangère. Cela ne fonctionne que sur les tables liées où des contraintes sont déclarées.

Si je comprends bien, si une relation FK n'a pas d'index qui correspond à chaque colonne dans certains index nécessaires, il peut y avoir certains index qui ont certaines des colonnes. Par exemple, si une relation FK a trois colonnes ( a, b, c) mais il n'y a pas d' index avec ces mêmes trois colonnes, il peut exister un indice qui a ( a, b) ou ( a, c) ou ( b, c) et peut aider avec des requêtes , mais ils nécessitent des analyses d'index sur les lignes avec la colonne manquante.

S'il n'y a aucun index pouvant prendre en charge une contrainte FK, le "nombre d'index de correspondance partielle" sera égal à zéro ( 0), ou du moins n'incrémentera pas ce nombre.

RolandoMySQLDBA
la source
Est-ce cela que vous aviez en tête? Je n'arrive toujours pas à le faire fonctionner ... dbfiddle.uk/…
Joe Obbish
Pas exactement. Essayez de créer un FK avec (FKey2,FKey3)et créez un index sur FKey2. Veuillez essayer.
RolandoMySQLDBA
N'oubliez pas que je ne suis pas un gars de SQL Server, mais j'essaie simplement d'aider.
RolandoMySQLDBA
Je comprends et apprécie toutes les idées à essayer. Je ne peux pas non plus faire fonctionner la première colonne.
Joe Obbish
Vous pouvez abandonner create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), conserver l'index FKey2et réessayer.
RolandoMySQLDBA