Det finns några skillnader mellan temporära tabeller (#tmp) och tabellvariabler (@tmp), även om användningen av tempdb inte är en av dem, vilket skrivs i MSDN-länken nedan.
Som en tumregel bör du använda tabellvariabler för små till medelstora datamängder och enkla användningsscenarier. (Detta är en alltför bred riktlinje med naturligtvis massor av undantag - se nedan och följande artiklar.)
Några punkter att tänka på när du väljer mellan dem:
-
Temporära tabeller är riktiga tabeller så att du kan göra saker som SKAPA INDEX, etc. Om du har stora mängder data för vilka åtkomst via index kommer att vara snabbare är tillfälliga tabeller ett bra alternativ.
-
Tabellvariabler kan ha index genom att använda PRIMARY KEY eller UNIQUE begränsningar. (Om du vill ha ett icke-unikt index, inkludera bara primärnyckelkolumnen som den sista kolumnen i den unika begränsningen. Om du inte har en unik kolumn kan du använda en identitetskolumn.) SQL 2014 har också icke-unika index .
-
Tabellvariabler deltar inte i transaktioner och
SELECT
s är implicit medNOLOCK
. Transaktionsbeteendet kan vara till stor hjälp, till exempel om du vill ROLLBACK halvvägs genom en procedur kommer tabellvariabler som fylls i under den transaktionen fortfarande att fyllas i! -
Temp-tabeller kan leda till att lagrade procedurer kompileras om, kanske ofta. Tabellvariabler gör det inte.
-
Du kan skapa en temporär tabell med hjälp av SELECT INTO, som kan vara snabbare att skriva (bra för ad-hoc-förfrågningar) och kan tillåta dig att hantera ändrade datatyper över tid, eftersom du inte behöver definiera din temporära tabellstruktur i förväg.
-
Du kan skicka tillbaka tabellvariabler från funktioner, vilket gör att du kan kapsla in och återanvända logik mycket enklare (t.ex. göra en funktion för att dela upp en sträng i en tabell med värden på någon godtycklig avgränsare).
-
Genom att använda tabellvariabler inom användardefinierade funktioner kan dessa funktioner användas mer allmänt (se CREATE FUNCTION-dokumentationen för detaljer). Om du skriver en funktion bör du använda tabellvariabler över temporära tabeller om det inte finns ett tvingande behov av annat.
-
Både tabellvariabler och temptabeller lagras i tempdb. Men tabellvariabler (sedan 2005) har som standard sorteringen av den aktuella databasen kontra temporära tabeller som tar standardsorteringen av tempdb (ref). Det betyder att du bör vara medveten om sorteringsproblem om du använder temp-tabeller och din db-sortering skiljer sig från tempdbs, vilket orsakar problem om du vill jämföra data i temp-tabellen med data i din databas.
-
Globala Temp-tabeller (##tmp) är en annan typ av tillfälliga tabeller som är tillgängliga för alla sessioner och användare.
Lite ytterligare läsning:
-
Martin Smiths fantastiska svar på dba.stackexchange.com
-
MSDN FAQ om skillnaden mellan de två:https://support.microsoft.com/en-gb/kb/305977
-
MDSN-bloggartikel:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Artikel:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Oväntade beteenden och prestandaimplikationer av temptabeller och tempvariabler:Paul White på SQLblog.com