Er zijn een paar verschillen tussen tijdelijke tabellen (#tmp) en tabelvariabelen (@tmp), hoewel het gebruik van tempdb daar niet een van is, zoals beschreven in de MSDN-link hieronder.
Als vuistregel moet u voor kleine tot middelgrote gegevensvolumes en eenvoudige gebruiksscenario's tabelvariabelen gebruiken. (Dit is een te brede richtlijn met natuurlijk veel uitzonderingen - zie hieronder en de volgende artikelen.)
Enkele punten om te overwegen bij het kiezen tussen hen:
-
Tijdelijke tabellen zijn echte tabellen, dus u kunt dingen doen als INDEX's MAKEN, enz. Als u grote hoeveelheden gegevens heeft waarvoor de toegang via de index sneller zal zijn, dan zijn tijdelijke tabellen een goede optie.
-
Tabelvariabelen kunnen indexen hebben door PRIMARY KEY of UNIQUE-beperkingen te gebruiken. (Als u een niet-unieke index wilt, neemt u gewoon de primaire sleutelkolom op als de laatste kolom in de unieke beperking. Als u geen unieke kolom heeft, kunt u een identiteitskolom gebruiken.) SQL 2014 heeft ook niet-unieke indexen .
-
Tabelvariabelen nemen niet deel aan transacties en
SELECT
s zijn impliciet metNOLOCK
. Het transactiegedrag kan erg handig zijn, als u bijvoorbeeld halverwege een procedure ROLLBACK wilt, worden tabelvariabelen die tijdens die transactie zijn ingevuld nog steeds ingevuld! -
Tijdelijke tabellen kunnen ertoe leiden dat opgeslagen procedures vaak opnieuw worden gecompileerd. Tabelvariabelen niet.
-
U kunt een tijdelijke tabel maken met SELECT INTO, die sneller kan worden geschreven (goed voor ad-hocquery's) en waarmee u in de loop van de tijd kunt omgaan met veranderende gegevenstypen, omdat u uw tijdelijke tabelstructuur niet vooraf hoeft te definiëren.
-
Je kunt tabelvariabelen teruggeven vanuit functies, waardoor je logica veel gemakkelijker kunt inkapselen en hergebruiken (maak bijvoorbeeld een functie om een string te splitsen in een tabel met waarden op een willekeurig scheidingsteken).
-
Door tabelvariabelen te gebruiken binnen door de gebruiker gedefinieerde functies kunnen deze functies op grotere schaal worden gebruikt (zie CREATE FUNCTION-documentatie voor details). Als je een functie schrijft, moet je tabelvariabelen gebruiken in plaats van tijdelijke tabellen, tenzij er een dwingende noodzaak is om iets anders te doen.
-
Zowel tabelvariabelen als tijdelijke tabellen worden opgeslagen in tempdb. Maar tabelvariabelen (sinds 2005) gebruiken standaard de sortering van de huidige database versus tijdelijke tabellen die de standaardsortering van tempdb nemen (ref). Dit betekent dat u zich bewust moet zijn van sorteerproblemen als u tijdelijke tabellen gebruikt en uw db-sortering anders is dan die van tempdb, wat problemen veroorzaakt als u gegevens in de tijdelijke tabel wilt vergelijken met gegevens in uw database.
-
Globale tijdelijke tabellen (##tmp) zijn een ander type tijdelijke tabellen die beschikbaar zijn voor alle sessies en gebruikers.
Nog wat leesvoer:
-
Het geweldige antwoord van Martin Smith op dba.stackexchange.com
-
MSDN FAQ over het verschil tussen de twee:https://support.microsoft.com/en-gb/kb/305977
-
MDSN-blogartikel: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
-
Onverwacht gedrag en prestatie-implicaties van tijdelijke tabellen en tijdelijke variabelen:Paul White op SQLblog.com