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)

enter image description here

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?

War es hilfreich?

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/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top