sql >> Databasteknik >  >> RDS >> Sqlserver

Använda med vs deklarera en temporär tabell:prestanda / skillnad?

@table syntax skapar en tabellvariabel (en faktisk tabell i tempdb ) och materialiserar resultaten till den.

WITH syntax definierar ett vanligt tabelluttryck som inte materialiseras och bara är en inline-vy.

För det mesta skulle det vara bättre att använda det andra alternativet. Du nämner att detta är inuti en funktion. Om detta är en TVF vill du oftast att dessa ska vara inline snarare än multi-sats så att de kan utökas av optimeraren - detta skulle omedelbart förbjuda användningen av tabellvariabler.

Men ibland (säg att den underliggande frågan är dyr och du vill undvika att den exekveras flera gånger) kanske du kan avgöra att realisering av mellanresultaten förbättrar prestandan i vissa specifika fall. Det finns inte för närvarande att tvinga fram detta för CTE (utan att tvinga fram en planguide åtminstone )

I så fall har du (i allmänhet) 3 alternativ. En @tablevariable , #localtemp tabell och en ##globaltemp tabell. Men endast den första av dessa är tillåten för användning i en funktion.

För ytterligare information om skillnaderna mellan tabellvariabler och #temp-tabeller se här .



  1. PostgreSQL-fråga för att returnera resultat som en kommaseparerad lista

  2. Bästa praxis för lös koppling mellan data och användargränssnitt i Android - Adapter, Filter, CursorLoader och ContentProvider

  3. INSERT INTO SELECT * för SQL Server, inte möjligt, har jag rätt?

  4. Returnera en boolean från en PHP-fil till AJAX one - Follow-knappen