De @table
syntaxis maakt een tabelvariabele aan (een echte tabel in tempdb
) en materialiseert de resultaten ervan.
De WITH
syntaxis definieert een Common Table Expression
die niet wordt gerealiseerd en slechts een inline-weergave is.
Meestal kunt u beter de tweede optie gebruiken. U vermeldt dat dit binnen een functie is. Als dit een TVF is, dan wil je meestal dat deze inline zijn in plaats van meerdere statements, zodat ze kunnen worden uitgebreid door de optimizer - dit zou het gebruik van tabelvariabelen onmiddellijk verbieden.
Soms echter (stel dat de onderliggende query duur is en u wilt voorkomen dat deze meerdere keren wordt uitgevoerd) kunt u vaststellen dat het materialiseren van de tussenresultaten de prestaties in bepaalde specifieke gevallen verbetert. Er is momenteel niet mogelijk om dit voor CTE's te forceren (zonder ten minste een plangids te forceren )
In dat geval heb je (over het algemeen) 3 opties. Een @tablevariable
, #localtemp
tabel en een ##globaltemp
tafel. Alleen de eerste hiervan is echter toegestaan voor gebruik binnen een functie.
Voor meer informatie over de verschillen tussen tabelvariabelen en #temp-tabellen zie hier .