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

Mit vs deklarieren Sie eine temporäre Tabelle:Leistung / Unterschied?

Die @table Syntax erstellt eine Tabellenvariable (eine tatsächliche Tabelle in tempdb ) und materialisiert die Ergebnisse dazu.

Der WITH Syntax definiert einen Common Table Expression die nicht materialisiert ist und nur eine Inline-Ansicht ist.

Meistens wäre es besser, die zweite Option zu verwenden. Sie erwähnen, dass dies in einer Funktion ist. Wenn es sich um eine TVF handelt, möchten Sie, dass diese meistens inline und nicht mit mehreren Anweisungen sind, damit sie vom Optimierer erweitert werden können - dies würde die Verwendung von Tabellenvariablen sofort verbieten.

Manchmal jedoch (z. B. wenn die zugrunde liegende Abfrage teuer ist und Sie vermeiden möchten, dass sie mehrmals ausgeführt wird) stellen Sie möglicherweise fest, dass die Materialisierung der Zwischenergebnisse in bestimmten Fällen die Leistung verbessert. Es gibt aktuell keine Möglichkeit dies für CTEs zu erzwingen (ohne zumindest eine Plananleitung zu erzwingen<). /a> )

In diesem Fall haben Sie (im Allgemeinen) 3 Möglichkeiten. Eine @tablevariable , #localtemp Tabelle und ein ##globaltemp Tisch. Allerdings ist nur die erste davon zur Verwendung innerhalb einer Funktion erlaubt.

Für weitere Informationen zu den Unterschieden zwischen Tabellenvariablen und #temp-Tabellen siehe hier .