SQL Server 2008 Join Tipps
-
20-09-2019 - |
Frage
Vor kurzem habe ich versucht, diese Abfrage zu optimieren
UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID
Der geschätzte Ausführungsplan zeigt 57% auf dem Tabellenaktualisierung und 40% in einem Hash -Match (Aggregat). Ich habe einige herumgeschnüffelt und bin auf das Thema Join -Tipps gestoßen. Also fügte ich meinem inneren Join und Wa-Zham einen Schleife hinzu! Der neue Ausführungsplan zeigt 38% auf dem Tabellenaktualisierung und 58% in einem Indexsuch.
Also wollte ich gerade anfangen, Schleifenhinweise auf alle meine Fragen anzuwenden, bis die Klugheit mich besiegte. Nach einigem Googeln wurde mir klar, dass Join -Tipps nicht sehr gut bedeckt sind Bol. Deswegen...
- Kann mir bitte jemand sagen, warum die Anwendung von Schleifen auf alle meine Fragen eine schlechte Idee ist. Ich habe irgendwo gelesen, dass ein Loop -Join die Standard -Join -Methode für Abfrageoptimierer ist, aber die Gültigkeit der Anweisung nicht überprüfen konnte?
- Wann werden Join Tipps verwendet? Wenn der Sh*t den Ventilator und Ghost Busters nicht in der Stadt trifft?
- Was ist der Unterschied zwischen Loop-, Hash- und Merge -Hinweisen? BOL gibt an, dass die Zusammenführung die langsamste zu sein scheint, aber was ist die Anwendung jedes Hinweises?
Vielen Dank für Ihre Zeit und helfen Sie den Menschen!
Ich führe übrigens SQL Server 2008 aus. Die oben genannten Statistiken sind geschätzte Ausführungspläne.
Lösung
Kann mir bitte jemand sagen, warum die Anwendung von Schleifen auf alle meine Fragen eine schlechte Idee ist. Ich habe irgendwo gelesen, dass ein Loop -Join die Standard -Join -Methode für Abfrageoptimierer ist, aber die Gültigkeit der Anweisung nicht überprüfen konnte?
Weil dies den Optimierer der Möglichkeit beraubt, andere Methoden zu berücksichtigen, die effizienter sein können.
Wann werden Join Tipps verwendet? Wenn der Sh*t den Ventilator und Ghost Busters nicht in der Stadt trifft?
Wenn die Datenverteilung (auf die der Optimierer seine Entscheidungen trifft) stark verzerrt ist und die Statistiken nicht in der Lage sind, sie korrekt darzustellen.
Was ist der Unterschied zwischen Loop-, Hash- und Merge -Hinweisen? BOL gibt an, dass die Zusammenführung die langsamste zu sein scheint, aber was ist die Anwendung jedes Hinweises?
Dies sind unterschiedliche Algorithmen.
LOOP
ist verschachtelte Schleifen: Für jeden Datensatz aus der äußeren Tabelle wird die innere Tabelle nach Übereinstimmungen durchsucht (unter Verwendung des verfügbaren Index). Am schnellsten, wenn nur ein kleiner Teil der Aufzeichnungen aus beiden Tischen die erfülltJOIN
und dieWHERE
Bedingungen.MERGE
Sortiert beide Tische werden in der Sortierreihenfolge durchquert und überspringen die unübertroffenen Datensätze. Am schnellsten für dieFULL JOIN
s und wenn beide Datensätze bereits sortiert sind (aus früheren Sortiervorgängen oder wenn der Indexzugriffspfad verwendet wird)HASH
Erstellen Sie eine Hash -Tabelle im temporären Speicher (Speicher odertempdb
) aus einem der Tabellen und durchsucht es für jeden Datensatz von der anderen. Das schnellste, wenn der große Teil der Rekorde aus beiden Tischs mit dem übereinstimmtWHERE
undJOIN
Bedingung.
Andere Tipps
Der geschätzte Ausführungsplan zeigt 57% auf dem Tabellenaktualisierung und 40% in einem Hash -Match (Aggregat). Ich habe einige herumgeschnüffelt und bin auf das Thema Join -Tipps gestoßen. Also fügte ich meinem inneren Join und Wa-Zham einen Schleife hinzu! Der neue Ausführungsplan zeigt 38% auf dem Tabellenaktualisierung und 58% in einem Indexsuch.
Das bedeutet sicherlich, dass Ihr vorgeschlagener Plan schlechter ist? Unter der Annahme, dass das Tabellen -Update eine konstante Zeit erfordert, wird es jetzt durch die Indexaktivität gekostet.