Ok, ich verstehe, dass dies eine ziemlich vage Frage ist, aber ertragen Sie mit mir.Warum wählt ein SQL-Join einen nicht optimalen Abfrageplan?
Ich habe dieses Problem bei verschiedenen Gelegenheiten mit verschiedenen und nicht verwandten Abfragen erlebt. Die Abfrage dauert unter vielen Minuten auszuführen:
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT JOIN (SELECT <Fields> FROM <Multiple Tables Joined>) ON <Condition>
jedoch nur durch das Hinzufügen der Hinweis verbinden sie die ausführt, in nur wenigen Sekunden abfragen:
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT HASH JOIN (SELECT <Fields> FROM <Multiple Tables Joined>) ON <Condition>
Das Merkwürdige ist, die Art der in der angegebenen JOIN Hinweis ist nicht wirklich was die Leistung verbessert. Scheinbar verursacht der Hinweis, dass der Optimierer die Unterabfrage isoliert ausführt und dann beitritt. Ich sehe die gleiche Leistungsverbesserung, wenn ich eine Tabellenwertfunktion (keine Inline-Funktion) für die Unterabfrage erzeuge. z.B.
SELECT <Fields>
FROM <Multiple Tables Joined>
LEFT JOIN dbo.MySubQueryFunction() ON <Condition>
Jeder hat irgendwelche Ideen, warum der Optimierer in diesem Fall so dumm ist?
Welche Version von SQL Server verwenden Sie? – Austin
Ich habe das Problem in beiden 2005 und 2008 –