Grundlegendes zu Hashverknüpfungen

Die Hashverknüpfung verfügt über zwei Eingaben: die Erstellungseingabe und Untersuchungseingabe. Der Abfrageoptimierer weist diese Rollen so zu, dass die kleinere Eingabe als Erstellungseingabe verwendet wird.

Hashverknüpfungen werden für viele ergebnismengenorientierte Operationen verwendet: INNER JOIN (innere Verknüpfung); LEFT, RIGHT und FULL OUTER JOIN (linke, rechte und vollständige äußere Verknüpfung); LEFT SEMI-JOIN und RIGHT SEMI-JOIN (linke und rechte Semiverknüpfung); INTERSECTION (Schnittmenge); UNION (Vereinigungsmenge) und DIFFERENCE (Restmenge). Darüber hinaus können mit einer Variante der Hashverknüpfung Duplikate entfernt und Gruppierungen vorgenommen werden, z. B. SUM(Gehalt) GROUP BY Abteilung. Diese Varianten verwenden dieselbe Eingabe als Erstellungseingabe und Untersuchungseingabe.

In den folgenden Abschnitten werden verschiedene Typen von Hashverknüpfungen beschrieben: arbeitsspeicherinterne Hashverknüpfung, schrittweise Hashverknüpfung und rekursive Hashverknüpfung.

Arbeitsspeicherinterne Hashverknüpfung

Die Hashverknüpfung scannt oder berechnet zuerst die gesamte Erstellungseingabe und erstellt dann eine Hashtabelle im Arbeitsspeicher. Jede Zeile wird in ein Hashbucket eingefügt, abhängig von dem für den Hashschlüssel berechneten Hashwert. Wenn die gesamte Erstellungseingabe kleiner als der verfügbare Arbeitsspeicher ist, können alle Zeilen in die Hashtabelle eingefügt werden. Auf diese Erstellungsphase folgt die Untersuchungsphase. Die gesamte Untersuchungseingabe wird zeilenweise gescannt oder berechnet, und für jede Untersuchungszeile wird der Wert des Hashschlüssels berechnet, das entsprechende Hashbucket wird gescannt, und die Übereinstimmungen werden erzeugt.

Schrittweise Hashverknüpfung

Wenn die Erstellungseingabe nicht vollständig in den Arbeitsspeicher passt, wird die Hashverknüpfung in mehreren Schritten durchgeführt. Dies wird als schrittweise Hashverknüpfung bezeichnet. Jeder Schritt besteht aus einer Erstellungsphase und einer Untersuchungsphase. Zuerst wird die gesamte Erstellungseingabe und Untersuchungseingabe verarbeitet und (durch Anwenden einer Hashfunktion auf die Hashschlüssel) in mehrere Dateien aufgeteilt. Durch Anwenden der Hashfunktion auf die Hashschlüssel wird sichergestellt, dass die zwei zu verknüpfenden Datensätze sich stets in demselben Dateipaar befinden. So wird die Aufgabe, zwei umfangreiche Eingaben zu verknüpfen, auf mehrere kleinere gleichartige Teilaufgaben reduziert. Die Hashverknüpfung wird dann auf jedes Paar partitionierter Dateien angewendet.

Rekursive Hashverknüpfung

Wenn die Erstellungseingabe so umfangreich ist, dass Eingaben für einen standardmäßigen externen Mergeprozess mehrere Mergeebenen erfordern würden, sind mehrere Partitionierungsschritte und mehrere Partitionierungsebenen erforderlich. Sind nur einige Partitionen umfangreich, so sind zusätzliche Partitionierungsschritte nur für diese Partitionen erforderlich. Um alle Partitionierungsschritte möglichst schnell zu machen, werden umfangreiche, asynchrone E/A-Operationen verwendet, sodass bereits ein Thread mehrere Datenträger auslastet.

HinweisHinweis

Wenn die Erstellungseingabe nur wenig umfangreicher als der verfügbare Arbeitsspeicher ist, werden Elemente der schrittweisen und der arbeitsspeicherinternen Hashverknüpfung in einem Schritt kombiniert, sodass eine hybride Hashverknüpfung entsteht.

Bei der Optimierung kann nicht in jedem Fall ermittelt werden, welche Hashverknüpfung verwendet wird. Daher verwendet SQL Server zunächst eine arbeitsspeicherinterne Hashverknüpfung und geht, abhängig von der Größe der Erstellungseingabe, sukzessive zur schrittweisen und rekursiven Hashverknüpfung über.

Wenn der Optimierer falsch einschätzt, welche Eingabe kleiner ist und daher als Erstellungseingabe verwendet werden müsste, werden die Rollen der Erstellungs- und der Untersuchungseingabe dynamisch vertauscht. Die Hashverknüpfung stellt sicher, dass die kleinere Überlaufdatei als Erstellungseingabe verwendet wird. Diese Technik wird als Rollentausch bezeichnet. Ein Rollentausch tritt innerhalb der Hashverknüpfung nach mindestens einem Überlauf auf den Datenträger auf.

HinweisHinweis

Der Rollentausch tritt unabhängig von Abfragehinweisen oder von der Struktur auf. Der Rollentausch wird nicht im Abfrageplan angezeigt. Wenn ein solcher Vorgang auftritt, erfolgt er transparent für den Benutzer.

Hashabbruch

Der Begriff Hashabbruch wird manchmal zur Beschreibung von schrittweisen oder rekursiven Hashverknüpfungen verwendet.

HinweisHinweis

Rekursive Hashverknüpfungen oder Hashabbrüche verursachen eine reduzierte Leistung auf dem Server. Wenn in einer Ablaufverfolgung viele Hash Warning-Ereignisse angezeigt werden, sollten Sie die Statistiken für die verknüpften Spalten aktualisieren.

Weitere Informationen zu Hashabbrüchen finden Sie unter Hash Warning-Ereignisklasse.