it-swarm.com.de

Grundlagen des Ausführungsplans - Verwirrung bei Hash-Übereinstimmungen

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)

enter image description here

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 bis zu einem gewissen Grad funktionieren, aber ich bin verwirrt darüber, welche Werte in einem Beispiel wie diesem genau gehasht werden.

Was für mich Sinn machen würde, ist, dass das gemeinsame Feld zwischen ihnen, die ID, gehasht wird - aber wenn dies der Fall ist, warum eine Zahl hashen?

41
Kyle Brandt

Wie die Antwort von SQLRockstar zitiert

am besten für große, unsortierte Eingänge.

Jetzt,

  • aus dem Users.DisplayName-Index-Scan (angenommen, nicht gruppiert) erhalten Sie Users.Id (vorausgesetzt, gruppiert) = unsortiert
  • Sie scannen auch Posts nach OwnerUserId = unsortiert

Dies sind 2 ungeordnete Eingänge.

Ich würde einen Index für die Posts-Tabelle auf OwnerUserId in Betracht ziehen, einschließlich Titel. Dadurch wird eine Reihenfolge auf einer Seite der Eingabe zum JOIN + hinzugefügt, der den Index abdeckt

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

Möglicherweise stellen Sie dann fest, dass der Users.DisplayName-Index nicht verwendet wird und stattdessen die PK scannt.

31
gbn

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

"Der Hash-Join ist eine der teureren Join-Operationen, da für den Join eine Hash-Tabelle erstellt werden muss. Dies ist jedoch der Join, der für große, unsortierte Eingaben am besten geeignet ist. Er ist der speicherintensivste von allen der Joins

Der Hash-Join liest zuerst eine der Eingaben und hasht die Join-Spalte und fügt den resultierenden Hash und die Spaltenwerte in eine im Speicher aufgebaute Hash-Tabelle ein. Dann liest es alle Zeilen in der zweiten Eingabe, hasht diese und überprüft die Zeilen im resultierenden Hash-Bucket auf die verbindenden Zeilen. "

welche Links zu diesem Beitrag:

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

HTH

14
SQLRockstar

Der Vorteil des Hashens eines numerischen Felds besteht darin, dass Sie einen größeren Wert nehmen und ihn in kleinere Teile zerlegen, damit er in eine Hash-Tabelle passt.

Grant Fritchey beschreibt es folgendermaßen:

"Eine Hash-Tabelle hingegen ist 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 ein Element eingeht. Zum Beispiel Sie können eine Zeile aus einer Tabelle nehmen, sie in einen Hashwert umwandeln und dann den Hashwert in einer Hash-Tabelle speichern. "

Sie können auch eine kostenlose Kopie seines eBooks "Dissecting SQL Server Execution Plans" über einen Link aus dem folgenden Artikel erhalten:

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

9
Jeff