Mezi dočasnými tabulkami (#tmp) a proměnnými tabulky (@tmp) je několik rozdílů, i když použití tempdb není jedním z nich, jak je uvedeno v odkazu MSDN níže.
Obecně platí, že pro malé až střední objemy dat a jednoduché scénáře použití byste měli používat proměnné tabulky. (Toto je příliš široké pravidlo samozřejmě se spoustou výjimek – viz níže a následující články.)
Některé body, které je třeba zvážit při výběru mezi nimi:
-
Dočasné tabulky jsou skutečné tabulky, takže můžete dělat věci jako VYTVOŘENÍ INDEXů atd. Pokud máte velké množství dat, pro která bude přístup pomocí indexu rychlejší, jsou dočasné tabulky dobrou volbou.
-
Proměnné tabulky mohou mít indexy pomocí omezení PRIMARY KEY nebo UNIQUE. (Pokud chcete nejedinečný index, stačí zahrnout sloupec primárního klíče jako poslední sloupec v podmínce jedinečnosti. Pokud nemáte jedinečný sloupec, můžete použít sloupec identity.) SQL 2014 má také nejedinečné indexy .
-
Proměnné tabulky se neúčastní transakcí a
SELECT
s jsou implicitně sNOLOCK
. Chování transakce může být velmi užitečné, například pokud chcete VRATIT uprostřed procedury, pak proměnné tabulky naplněné během této transakce budou stále naplněny! -
Dočasné tabulky mohou vést k rekompilaci uložených procedur, možná často. Proměnné tabulky nebudou.
-
Dočasnou tabulku můžete vytvořit pomocí SELECT INTO, jejíž zápis může být rychlejší (vhodné pro ad-hoc dotazování) a může vám umožnit vypořádat se s měnícími se datovými typy v průběhu času, protože nemusíte předem definovat strukturu dočasné tabulky.
-
Proměnné tabulky můžete předávat zpět z funkcí, což vám umožní mnohem snadněji zapouzdřit a znovu použít logiku (např. vytvořit funkci pro rozdělení řetězce do tabulky hodnot na nějakém libovolném oddělovači).
-
Použití tabulkových proměnných v rámci uživatelsky definovaných funkcí umožňuje širší využití těchto funkcí (podrobnosti viz dokumentace CREATE FUNCTION). Pokud píšete funkci, měli byste nad dočasnými tabulkami používat proměnné tabulky, pokud není naléhavě nutné jinak.
-
Proměnné tabulky i dočasné tabulky jsou uloženy v databázi tempdb. Ale proměnné tabulky (od roku 2005) jsou výchozí pro řazení aktuální databáze oproti dočasným tabulkám, které používají výchozí řazení tempdb (ref). To znamená, že byste si měli být vědomi problémů s řazením, pokud používáte dočasné tabulky a vaše řazení db se liší od tempdb, což způsobuje problémy, pokud chcete porovnat data v dočasné tabulce s daty ve vaší databázi.
-
Globální dočasné tabulky (##tmp) jsou dalším typem dočasné tabulky dostupné všem relacím a uživatelům.
Něco dalšího ke čtení:
-
Skvělá odpověď Martina Smithe na dba.stackexchange.com
-
Nejčastější dotazy k MSDN o rozdílech mezi těmito dvěma:https://support.microsoft.com/en-gb/kb/305977
-
Článek blogu MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Článek:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Neočekávané chování a dopady na výkon dočasných tabulek a dočasných proměnných:Paul White na SQLblog.com