Ich fange an, Ausführungspläne zu lernen und bin verwirrt darüber, wie genau ein Hash-Match funktioniert und warum es in einem einfachen Join verwendet wird:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Soweit ich weiß, werden die Ergebnisse des Top-Index-Scans zum Hash und jede Zeile im unteren Index-Cluster-Scan wird nachgeschlagen. Ich verstehe, wie Hash-Tabellen zumindest zu einem gewissen Grad funktionieren, bin jedoch verwirrt darüber, welche Werte in einem Beispiel wie diesem genau gehasht werden.
Was für mich Sinn machen würde, ist das gemeinsame Feld zwischen ihnen, die ID, ist gehasht - aber wenn dies der Fall ist, warum ist eine Zahl gehasht?
quelle
OPTION (FAST n)
Hinweis versuchen , wobei n die ungefähre Anzahl der zu erwartenden Zeilen ist. Dies führt dazu, dass der Optimierer eher auf verschachtelte Schleifen als auf Hash-Verknüpfungen ausgerichtet wird, wenn n niedrig ist. Der Grund dafür ist, dass Hash-Joins für große Joins schnell sind, aber hohe Startkosten verursachen. Verschachtelte Schleifen sind pro Zeile teuer, können aber sehr billig gestartet werden. Es ist also eine Frage der Feinabstimmung basierend auf Ihren tatsächlichen Daten und Zugriffsmustern.Von http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/
"Die Hash-Verknüpfung ist eine der teureren Verknüpfungsoperationen, da für die Verknüpfung eine Hash-Tabelle erstellt werden muss. Die Verknüpfung eignet sich jedoch am besten für große, unsortierte Eingaben. Sie ist die speicherintensivste von allen der Joins
Beim Hash-Join wird zuerst eine der Eingaben gelesen und die Join-Spalte gehasht. Der resultierende Hash und die Spaltenwerte werden in eine im Speicher erstellte Hash-Tabelle eingefügt. Dann werden alle Zeilen in der zweiten Eingabe gelesen, diese gehasht und die Zeilen im resultierenden Hash-Bucket auf die verbindenden Zeilen überprüft. "
welche Links zu diesem Beitrag:
http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx
HTH
quelle
Das Hashing eines numerischen Felds hat den Vorteil, dass Sie einen größeren Wert in kleinere Teile zerlegen, damit er in eine Hash-Tabelle passt.
So beschreibt es Grant Fritchey:
Eine Hash-Tabelle ist andererseits eine Datenstruktur, die alle Elemente in gleich große Kategorien oder Buckets unterteilt, um einen schnellen Zugriff auf die Elemente zu ermöglichen. Die Hash-Funktion bestimmt, in welchen Bucket sich ein Element befindet können Sie eine Zeile aus einer Tabelle nehmen, sie in einen Hash-Wert hacken und dann den Hash-Wert in einer Hash-Tabelle speichern. "
Sie können auch eine kostenlose Kopie seines eBooks "Auflösen von SQL Server-Ausführungsplänen" über einen Link aus dem folgenden Artikel erhalten:
Quelle: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/
quelle