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...

  1. 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?
  2. Wann werden Join Tipps verwendet? Wenn der Sh*t den Ventilator und Ghost Busters nicht in der Stadt trifft?
  3. 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.

War es hilfreich?

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.

  1. 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üllt JOIN und die WHERE Bedingungen.

  2. MERGE Sortiert beide Tische werden in der Sortierreihenfolge durchquert und überspringen die unübertroffenen Datensätze. Am schnellsten für die FULL JOINs und wenn beide Datensätze bereits sortiert sind (aus früheren Sortiervorgängen oder wenn der Indexzugriffspfad verwendet wird)

  3. HASH Erstellen Sie eine Hash -Tabelle im temporären Speicher (Speicher oder tempdb) 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 übereinstimmt WHERE und JOIN 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top