web-dev-qa-db-fra.com

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

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:

FK check details

  • Nombre de références de clés étrangères est le nombre de clés étrangères entrantes.
  • Aucun nombre d'index correspondant est le 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 le nombre d'index de correspondance partielle représente.

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 colonne INCLUDE 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 ici au cas où quelqu'un pourrait l'utiliser comme point de départ pour en savoir plus sur les index de correspondance partielle.

27
Joe Obbish

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

La définition réelle de cela, dans l'intervalle, est la suivante:

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.

13
Sean Gallardy

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 1er mars 2013 Article de blog dans le blog de code de Carlos Klapp intitulé Foreign Keys without Indexes a la procédure stockée appelée Util_FKsWithoutIndexes qui 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 mis en cluster, ou s'il devrait 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 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 un index nécessaire, il peut y avoir certains index qui ont certaines des colonnes. Par exemple, si une relation FK a trois colonnes (a, b, c) mais qu'il n'y a pas d'index avec ces mêmes trois colonnes, il peut exister un index qui a (a, b) ou (a, c) ou (b, c) et peut aider avec des requêtes mais nécessitera 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 nul (0), ou du moins n'augmentera pas ce nombre.

3
RolandoMySQLDBA