Grundlagen für Ausführungsplan - Hash -Match -Verwirrung
-
16-10-2019 - |
Frage
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 oberen Index -Scans zum Hash fähig und jede Zeile im unteren Indexclustered -Scan wird nachschlagen. Ich verstehe, wie Hash -Tabellen zumindest zu einem gewissen Grad funktionieren, aber ich bin verwirrt darüber, welche Werte genau in einem Beispiel wie diesem gehasht werden.
Was würde mir Sinn machen, ist das gemeinsame Feld zwischen ihnen, der ID, ist gehasht - aber wenn dies der Fall ist, warum hat eine Nummer eine Nummer?
Lösung
Als Antwortzitate von Sqlrockstar
Am besten für große, ungedeckte Eingaben.
Jetzt,
- Von den users.displayName Index -Scan (angenommen nicht klustered) Sie erhalten Benutzer.
- Sie scannen auch Beiträge für EigentümerUSerID = unsortiert
Dies sind 2 ungeordnete Eingänge.
Ich würde einen Index in der Post -Tabelle über EigentümerUserid in Betracht ziehen, einschließlich Titel. Dadurch wird die Auftrag auf einer Seite des Eingangs zum Join + hinzugefügt, der den Index abdeckt
CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)
Sie können dann feststellen, dass der Index der Benutzer.
Andere Tipps
Aus http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/
"Der Hash-Join ist einer der teureren Join-Operationen, da die Schaffung eines Hash-Tisches erforderlich ist, um die Verbindung zu erstellen. Das heißt, es ist der Join, der für große, ungewöhnliche Eingaben am besten geeignet ist von den Verknüpfungen
Der Hash -Join liest zuerst einen der Eingänge und hashes in der Join -Spalte und bringt den resultierenden Hash und die Spaltenwerte in eine im Speicher aufgebaute Hash -Tabelle. Dann liest es alle Zeilen im zweiten Eingang, Hashes diese und überprüft die Zeilen im resultierenden Hash -Eimer auf die Verbindungsreihen. "
Welche Links zu diesem Beitrag:
http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx
HTH
Der Vorteil eines numerischen Feldes besteht darin, dass Sie einen größeren Wert einnehmen und ihn in kleinere Teile zerlegen, damit es in einen Hash -Tisch passen kann.
So beschreibt Grant Fritchey es:
"Eine Hash-Tabelle hingegen ist eine Datenstruktur, die alle Elemente in gleich große Kategorien oder Eimer unterteilt, um schnellen Zugriff auf die Elemente zu ermöglichen. Die Hashing-Funktion bestimmt, in welches Eimer ein Element eingeht. Zum Beispiel Sie können eine Zeile aus einer Tabelle nehmen, Hash in einen Hash -Wert und dann den Hash -Wert in eine Hash -Tabelle speichern. "
Sie können auch eine kostenlose Kopie seines E -Book -SQL -Serverausführungspläne aus einem Link aus dem folgenden Artikel erhalten:
Quelle: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-imple-sql- queries/