web-dev-qa-db-fra.com

Notions de base sur le plan d'exécution - Hash Match Confusion

Je commence à apprendre des plans d'exécution et je ne sais pas exactement comment fonctionne une correspondance de hachage et pourquoi elle serait utilisée dans une simple jointure:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

enter image description here

Si je comprends bien, les résultats de l'analyse d'index supérieur deviennent le hachage capable et chaque ligne de l'analyse en cluster d'index inférieure est recherchée. Je comprends comment les tables de hachage fonctionnent au moins dans une certaine mesure, mais je ne sais pas exactement quelles valeurs sont hachées dans un exemple comme celui-ci.

Ce qui aurait du sens pour moi, c'est que le champ commun entre eux, l'id, soit haché - mais si c'est le cas, pourquoi hacher un nombre?

41
Kyle Brandt

Comme le cite la réponse de SQLRockstar

idéal pour les grandes entrées non triées.

Maintenant,

  • à partir de l'analyse d'index Users.DisplayName (supposé non cluster), vous obtenez Users.Id (en supposant en cluster) = non trié
  • Vous analysez également les publications de OwnerUserId = unsorted

Il s'agit de 2 entrées non ordonnées.

Je considérerais un index sur la table Posts sur OwnerUserId, y compris le titre. Cela ajoutera un peu d'ordre d'un côté de l'entrée au JOIN + il couvrira l'index

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Vous pouvez alors constater que l'index Users.DisplayName ne sera pas utilisé et il analysera le PK à la place.

31
gbn

De http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"La jointure de hachage est l'une des opérations de jointure les plus coûteuses, car elle nécessite la création d'une table de hachage pour effectuer la jointure. Cela dit, c'est la jointure qui convient le mieux pour les entrées volumineuses et non triées. des jointures

La jointure de hachage lit d'abord l'une des entrées et hache la colonne de jointure et place le hachage résultant et les valeurs de colonne dans une table de hachage construite en mémoire. Il lit ensuite toutes les lignes de la deuxième entrée, les hache et vérifie les lignes dans le compartiment de hachage résultant pour les lignes de jointure. "

qui renvoie à ce post:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH

14
SQLRockstar

L'avantage de hacher un champ numérique est que vous prenez une plus grande valeur et que vous la décomposez en petits morceaux afin qu'elle puisse tenir dans une table de hachage.

Voici comment Grant Fritchey le décrit:

"Une table de hachage, en revanche, est une structure de données qui divise tous les éléments en catégories de taille égale, ou compartiments, pour permettre un accès rapide aux éléments. La fonction de hachage détermine dans quel compartiment un élément va. Par exemple , vous pouvez prendre une ligne d'une table, la hacher dans une valeur de hachage, puis stocker la valeur de hachage dans une table de hachage. "

Vous pouvez également obtenir une copie gratuite de son ebook "Dissection des plans d'exécution SQL Server" à partir d'un lien de l'article suivant:

Source: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/

9
Jeff