Visualisieren und behandeln Sie Hash Match Join

Dieser Beitrag ist der dritte Teil der Reihe über Join-Operatoren (lesen Sie unbedingt Teil 1 - Joins mit verschachtelten Schleifen und Teil 2 - Joins zusammenführen ). Die Übersetzung des Artikels wurde speziell für Studenten des Kurses "MS SQL Server Developer" erstellt .



Hash Match Joins sind die zuverlässigen Arbeitspferde physischer Verbindungsbetreiber.
Während der Join für verschachtelte Schleifen fehlschlägt, wenn zu viele Daten vorhanden sind, um in den Speicher zu passen, und für den Merge-Join die Eingabe sortiert werden muss, kombiniert Hash Match alle von Ihnen übermittelten Daten (sofern dies der Fall ist) Für die Verbindung wird ein Gleichheitsprädikat ausgeführt, und in Ihrer Tempdb ist bisher genügend freier Speicherplatz vorhanden.



Sehen Sie sich YouTube-Videos an


Der Hash-Match- Algorithmus besteht aus zwei Stufen, die wie folgt funktionieren:



Während der ersten Erstellungsphase erstellt SQL Server aus einer der Eingabetabellen (normalerweise der kleinsten der beiden) eine Hash-Tabelle im Speicher. Die Hashes werden basierend auf den Eingabetasten berechnet und dann zusammen mit der Zeile in der Hash-Tabelle im entsprechenden Block gespeichert. In den meisten Fällen gibt es in jedem Block nur eine Datenzeile, außer wenn:


  1. Es gibt Zeilen mit doppelten Schlüsseln.
  2. Die Hash-Funktion erzeugt eine Kollision, und völlig unterschiedliche Schlüssel erhalten denselben Hash (dies ist selten, aber möglich).

Nach dem Erstellen der Hash-Tabelle beginnt die Phase „Probe“ (Verifizierung). Im zweiten Schritt berechnet SQL Server den Schlüssel-Hash für jede Zeile in der zweiten Eingabetabelle und prüft, ob er in der im ersten Schritt erstellten Hash-Tabelle vorhanden ist. Wenn für diesen Hash eine Übereinstimmung vorliegt, wird geprüft, ob die Schlüssel der Zeile (n) in der Hash-Tabelle und der Zeilen aus der zweiten Tabelle wirklich übereinstimmen (diese Prüfung muss aufgrund möglicher Kollisionen durchgeführt werden).
Eine gängige Version des Hash-Match- Algorithmus tritt auf, wenn es in der Bauphase nicht möglich ist, eine Hash-Tabelle zu erstellen, die vollständig im Speicher gespeichert werden kann:



Dies geschieht, wenn mehr Daten vorhanden sind, als im Speicher gespeichert werden können, oder wenn SQL Server nicht genügend Speicher für eine Hash-Match- Verbindung bereitstellt.


Wenn SQL Server während der Erstellungsphase nicht über genügend Speicher verfügt, um die Hash-Tabelle zu speichern, funktioniert es weiter, indem einige Blöcke im Speicher gespeichert und andere Blöcke in Tempdb platziert werden.
In der Validierungsphase verkettet SQL Server die Datenzeilen aus der zweiten Tabelle zu Blöcken aus der Erstellungsphase im Speicher. Wenn der Block, dem diese Zeile möglicherweise entspricht, derzeit nicht über genügend Speicher verfügt, schreibt SQL Server diese Zeile zum späteren Vergleich in tempdb.


Wenn Übereinstimmungen für einen Block abgeschlossen sind, löscht SQL Server diese Daten aus dem Speicher und lädt die folgenden Blöcke in den Speicher. Anschließend werden die Zeilen der zweiten Tabelle (derzeit in Tempdb) mit den neuen Blöcken im Speicher verglichen.


Wie bei jeder physischen Join-Anweisung in dieser Serie finden Sie Details zur Hash-Match- Anweisung in der Hugo Kornelis-Hilfe zum Hash-Match .


Was zeigt Hash Match Join?


Wenn wir die internen Funktionen der Hash-Match-Verknüpfung kennen , können wir bestimmen, was der Optimierer über unsere Daten und vorgelagerten Verbindungsbetreiber denkt, und uns auf die Leistungsoptimierung konzentrieren.


Hier sind einige Szenarien, die Sie berücksichtigen sollten, wenn Sie das nächste Mal sehen, dass der Hash-Match-Join in Ihrem Ausführungsplan verwendet wird:


  • Während der Hash-Match-Join große Datenmengen kombinieren kann, ist das Erstellen einer Hash-Tabelle aus der ersten Eingabetabelle eine Blockierungsoperation, die die Ausführung nachfolgender Anweisungen verhindert. In diesem Zusammenhang überprüfe ich immer, ob es eine einfache Möglichkeit gibt, Hash-Übereinstimmungen in verschachtelte Schleifen zu konvertieren oder Verknüpfungen zusammenzuführen. Manchmal ist dies nicht möglich (zu viele Zeilen für verschachtelte Schleifen oder unsortierte Daten für Zusammenführungsverknüpfungen), aber es lohnt sich immer zu prüfen, ob eine einfache Indexänderung oder verbesserte Schätzungen aus der Aktualisierung der Statistiken resultieren, damit SQL Server eine nicht blockierende Hash-Match- Join-Anweisung auswählt
  • Hash-Match-Joins eignen sich hervorragend für große Verbindungen, da sie an Tempdb übertragen werden können. Dadurch können sie Verbindungen zu großen Datasets herstellen, was zu einer fehlgeschlagenen Verbindung im Speicher mithilfe verschachtelter Schleifen oder zum Zusammenführen von Join-Anweisungen führen kann.
    • Wenn Sie eine Hash-Match-Join- Anweisung sehen, bedeutet dies, dass SQL Server die Eingabe für zu groß hält. Wenn wir wissen, dass unsere Eingabedaten nicht so groß sein sollten, sollten Sie prüfen, ob Probleme mit Statistiken oder Schätzungen vorliegen, aufgrund derer SQL Server den Hash-Match-Join falsch auswählt.
  • Wenn der Hash-Match-Join im Speicher ausgeführt wird, ist er ziemlich effizient. Probleme treten auf, wenn die Erstellungsphase auf tempdb geht.
    • Wenn ich ein kleines gelbes Dreieck bemerke, das anzeigt, dass die Verbindung zu tempdb hergestellt wird, sehe ich, warum dies passiert ist: Wenn mehr Daten als Speicher verfügbar sind, kann wenig getan werden. Wenn der zugewiesene Speicher jedoch unangemessen klein erscheint, kann dies bedeuten, dass Wir haben wahrscheinlich noch ein Problem mit Statistiken, das zu zu niedrigen Schätzungen des SQL Server-Optimierers führt.

Vielen Dank für das Lesen des Artikels. Vielleicht gefällt dir auch mein Twitter .


Wir haben dieses Thema in einer früheren offenen Lektion behandelt . Warten auf Ihre Kommentare!

Source: https://habr.com/ru/post/de459314/


All Articles