Ich habe eine komplexe Abfrage, die ich in einer nachfolgenden Abfrage verwenden müssen (eigentlich Aussage aktualisieren). Ich habe versucht, sowohl eine CTE und eine temporäre Tabelle zu verwenden. Die Leistung, die den CTE verwendet, ist schrecklich gegenüber dem Ansatz der temporären Tabelle. Es ist ungefähr 15 Sekunden gegenüber Millisekunden. Um den Test zu vereinfachen, anstatt der CTE/Temp-Tabelle in der nachfolgenden Abfrage beizutreten, habe ich einfach * daraus ausgewählt. In diesem Fall führen sie das gleiche aus.SQL 2005 CTE vs TEMP wenn Tabelle Leistung verwendet in Joins von anderen Tabellen
Ich habe den Ausführungsplan für beide Ansätze sowohl mit den Joins in der nachfolgenden Abfrage untersucht und dann einfach * gewählt. Mit der einfachen Auswahl sind die Abfragepläne ungefähr gleich, aber mit den Joins in der Folge wählen die Abfragepläne nicht aus. Insbesondere der Teil des Abfrageplans zum Erstellen und Auffüllen der temporären Tabelle bleibt derselbe, während sich der Abfrageplanabschnitt zum Erstellen und Auffüllen des CTE erheblich ändert, wenn er anschließend in einer Abfrage mit einem Join verwendet wird.
Meine Frage ist, warum der Abfrageplan für die Erstellung und den Bestand des CTE ändern, wie es später verwendet wird, während die temporäre Tabelle nicht ist. Auch in welchen Szenarien würde ein CTE dann eine bessere Leistung erbringen als eine temporäre Tabelle?
* Anmerkung I als auch eine Tabelle Variable verwendet haben, und es ist auf der temporären Tabelle Ansatz vergleichbar.
Dank
Ja für materialisieren! Ein PK/IX in der Definition könnte nett sein. – crokusek