Frage

Was sind die Vorteile, wenn überhaupt, ausdrücklich eine regelmäßige JOIN ein Hashverknüpfung über tun (wird bei SQL Server entscheiden, die beste Strategie JOIN)? Zum Beispiel:

select pd.*
from profiledata pd
inner hash join profiledatavalue val on val.profiledataid=pd.id

In dem stark vereinfachten Beispielcode oben, ich bin Angabe der Strategie JOIN, während, wenn ich die „hash“ Schlüsselwort SQL Server ein MERGE wegzulassen JOIN hinter den Kulissen (pro dem „tatsächlichen Ausführungsplan“) tun wird.

War es hilfreich?

Lösung

Die optmiser macht einen guten Job genug für den täglichen Gebrauch. Allerdings könnte es 3 Wochen in Theorie braucht den perfekten Plan im Extreme zu finden, so gibt es eine Chance, dass der erzeugte Plan nicht ideal sein wird.

Ich würde es in Ruhe lassen, wenn Sie eine sehr komplexe Abfrage oder große Datenmengen haben, wo es einfach nicht einen guten Plan produzieren kann. Dann würde ich es in Betracht ziehen.

Aber im Laufe der Zeit, als Datenänderungen / wachsen oder Indizes ändern usw., Ihr JOIN Hinweis wird wird überflüssig und verhindert einen optimalen Plan. Ein JOIN Hinweis kann für die einzelne Abfrage zum Zeitpunkt der Entwicklung mit diesem Satz von Daten, die Sie haben nur optimieren.

Persönlich habe ich noch nie einen Hinweis in jedem Produktionscode JOIN angegeben.

Ich habe normalerweise gelöst schlecht um durch die Änderung meiner Join-Abfrage, das Hinzufügen / Ändern eines Index oder brechen sie oben (zB laden eine temporäre Tabelle zuerst). Oder meine Frage war einfach falsch, oder ich hatte eine implizite Datentypumwandlung, oder es markierte einen Fehler in meinem Schema usw.

Ich habe andere Entwickler verwenden sie gesehen, aber nur dort, wo sie auf komplexe Ansichten komplexe Ansichten eingenistet hatten und sie verursacht später Probleme, wenn sie Refactoring.

Edit:

hatte ich eine Umwandlung heute, wo einige Kollegen sie verwenden wollen einen schlechten Abfrage-Plan zu zwingen (mit NOLOCK und MAXDOP 1) auf „ermutigen“ Migration weg von Legacy-Komplex verschachtelten Ansichten, dass einer ihres nachgelagerten System direkt aufruft.

Andere Tipps

Wenn Sie einen Hash-Hinweis, um zu versuchen, wie etwa:

  • Nach der Überprüfung, dass eine angemessene Indizes auf mindestens einer der existieren Tabellen.
  • Nachdem die Abfrage neu zu ordnen versucht zu haben. Dinge wie die Umwandlung Joins „in“ oder „existiert“ an, um zu ändern kommen (was nur wirklich ein Hinweis sowieso), Bewegungslogik von where-Klausel Bedingung zu verbinden, etc.

Einige Grundregeln über, wenn ein Hash-Join wirksam ist, wenn eine Join-Bedingung nicht als Tabellenindex existiert und wenn die Tabellen Größen unterschiedlich sind. Wenn Sie sich für eine technische Beschreibung gibt die Suche sind einige gute Beschreibungen da draußen darüber, wie ein Hash-Werke verbinden.

Warum jede JOIN verwenden Hinweise (hash / merge / Schleife mit Nebenwirkung von Kraft Reihenfolge)?

  • Um zu vermeiden, extrem langsame Ausführung. (0,5 -> 10,0s) von Eckfällen
  • Wenn das Optimierungsprogramm konsequent wählt einen mäßigen Plan.

A geliefert Hinweis ist wahrscheinlich nicht ideal für einige Umstände sein, sondern bietet konsequente vorhersehbar Laufzeiten. Die erwartete Worst-Case und Best-Case-Szenarien sollten vorab getestet, wenn ein Hinweis verwendet. Vorhersehbare Runtimes sind entscheidend für Web-Dienste, bei denen eine starr optimierte nominal [.3s, .6s] Abfrage über eine bevorzugt, die reichen kann [0,25, 10,0 s] zum Beispiel. Große Laufzeitabweichungen können mit Statistiken passieren frisch aktualisiert und Best Practices gefolgt.

Wenn in einer Entwicklungsumgebung zu testen, sollte man ausschalten „Betrug“ als auch warm / kalt Laufzeitabweichungen zu vermeiden. Von einer anderen Post ...

CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache

Die letzte Option kann das gleiche wie die Option (recompile) Hinweis sein.

Die MAXDOP und Beladung der Maschine können auch einen großen Unterschied in der Laufzeit machen. Materialisierung von CTE in temporären Tabellen ist auch ein guter Verriegelung nach unten Mechanismus und etwas zu prüfen.

Hashverknüpfungen parallelisieren und skaliert besser als jeder andere beitreten und sind groß bei Durchsatz in Data Warehouse zu maximieren.

Der einzige Hinweis, den ich jemals in Versand Code gesehen habe war OPTION (FORCE ORDER). Dumme Fehler in SQL-Abfrage-Optimierer würde einen Plan erstellen, die einen ungefilterten varchar und eine eindeutige Kennung zu verbinden versucht. Hinzufügen FORCE ORDER verursacht es den Filter zuerst ausgeführt werden.

Ich weiß, Spalten Überlastung ist schlecht. Manchmal, du hast mit ihm zu leben.

Der logische Plan optimizator nicht versichern Sie, dass es die optimale Lösung findet: ein genauer Algorithmus ist zu langsam in einem Produktionsserver zu verwenden; stattdessen gibt es einige gierige Algorithmen verwendet.

Daher ist die Logik hinter diesen Befehlen der Benutzer zu lassen, um die optimale Join festlegen Strategie, im Fall der optimizator nicht aussortieren kann, was wirklich das Beste zu übernehmen.

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