SQL 2005 CTE vs TEMP-Tabelle Leistung bei Verwendung in Joins anderer Tabellen

Ich habe eine komplexe Abfrage, die ich in einer nachfolgenden Abfrage verwenden muss (tatsächlich Update-Anweisung). Ich habe sowohl mit einem CTE als auch mit einer temporären Tabelle versucht. Die Leistung unter Verwendung des CTE ist im Vergleich zum Temp-Table-Ansatz schrecklich. Es ist so etwas wie 15 Sekunden gegen Millisekunden. Um den Test zu vereinfachen, anstatt die CTE / Temp-Tabelle in der nachfolgenden Abfrage zu verknüpfen, habe ich einfach * ausgewählt. In diesem Fall verhalten sie sich genauso.

Ich habe mir den Ausführungsplan für beide Ansätze mit den Verknüpfungen in der nachfolgenden Abfrage angesehen und dann einfach * ausgewählt. Bei der einfachen Auswahl sind die Abfragepläne ungefähr gleich, bei den Verknüpfungen in der nachfolgenden Auswahl jedoch nicht. Insbesondere bleibt der Teil des Abfrageplans zum Erstellen und Auffüllen der temporären Tabelle unverändert, während sich der Abfrageplan zum Erstellen und Auffüllen des CTE dramatisch ändert, wenn er anschließend in einer Abfrage mit einem Join verwendet wird.

Meine Frage ist, warum sich der Abfrageplan für die Erstellung und Auffüllung des CTE dadurch ändert, wie er anschließend verwendet wird, während die temporäre Tabelle nicht verwendet wird. Auch in welchen Szenarien würde ein CTE dann eine bessere Leistung erbringen als eine temporäre Tabelle?

* Hinweis: Ich habe auch eine Tabellenvariable verwendet, die mit dem temporären Tabellenansatz vergleichbar ist.

Vielen Dank

Antworten auf die Frage(4)

Ihre Antwort auf die Frage