Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden CTEs Speicherplatz in tempdb?

Ich werde versuchen, MSDN nicht zu kopieren/einzufügen

Es spielt keine Rolle.

Ein CTE ist unabhängig von der Abfrageausführung:Es ist nur ein Sprachkonstrukt. Betrachten Sie es als ordentliche abgeleitete Tabelle oder Unterabfrage.

Das bedeutet, dass außer rekursiven CTEs (siehe später) alle CTEs können inline codiert werden. Wenn Sie den CTE-Code einmal verwenden, dient er der Lesbarkeit . Wenn Sie den CTE zweimal oder öfter verwenden, dann ist er defensiv:Sie möchten keinen Fehler machen und die abgeleitete Tabelle bei jeder Verwendung anders haben.

Wenn ein CTE zweimal oder öfter verwendet wird, wird dieser Code zweimal oder öfter ausgeführt. Es wird nicht einmal ausgeführt und in tempdb zwischengespeichert.

Zusammenfassung:Es kann oder auch nicht, genau wie wenn der Code inline wäre.

Hinweis:Ein rekursiver CTE ist einfach eine abgeleitete Tabelle in einer abgeleiteten Tabelle in einer abgeleiteten Tabelle in einer abgeleiteten Tabelle in einer abgeleiteten Tabelle in einem ... also gilt dasselbe.

Sie können dies in Tony Rogersons Artikel . Die Verwendung von tempdb würde sowieso passieren, wenn es inline codiert wäre. Er merkt auch an, dass die Verwendung einer temporären Tabelle aufgrund der oben erläuterten „Makro“-Erweiterung besser sein kann

FYI:das gleiche gilt für Aufrufe. Nur Makros.