Има няколко разлики между временни таблици (#tmp) и променливи на таблица (@tmp), въпреки че използването на tempdb не е една от тях, както е посочено в MSDN връзката по-долу.
Като правило, за малки до средни обеми данни и прости сценарии на използване трябва да използвате променливи в таблицата. (Това е твърде широка насока с, разбира се, много изключения - вижте по-долу и следващите статии.)
Някои точки, които трябва да имате предвид, когато избирате между тях:
-
Временните таблици са реални таблици, така че можете да правите неща като СЪЗДАВАТЕ ИНДЕКСИ и т.н. Ако имате големи количества данни, за които достъпът по индекс ще бъде по-бърз, тогава временните таблици са добър вариант.
-
Променливите в таблицата могат да имат индекси, като се използват ограничения PRIMARY KEY или UNIQUE. (Ако искате неуникален индекс, просто включете колоната с първичен ключ като последна колона в уникалното ограничение. Ако нямате уникална колона, можете да използвате колона за идентичност.) SQL 2014 също има неуникални индекси .
-
Табличните променливи не участват в транзакции и
SELECT
s са имплицитно сNOLOCK
. Поведението на транзакцията може да бъде много полезно, например, ако искате да се върнете по средата на процедурата, тогава променливите на таблицата, попълнени по време на тази транзакция, пак ще бъдат попълнени! -
Временните таблици може да доведат до прекомпилиране на съхранените процедури, може би често. Табличните променливи няма да бъдат.
-
Можете да създадете временна таблица с помощта на SELECT INTO, която може да бъде по-бърза за писане (добра за ad-hoc заявки) и може да ви позволи да се справите с промяната на типовете данни с течение на времето, тъй като не е необходимо да дефинирате структурата на временната таблица предварително.
-
Можете да предавате променливи на таблицата обратно от функции, което ви позволява да капсулирате и повторно използвате логиката много по-лесно (напр. да направите функция за разделяне на низ в таблица със стойности на произволен разделител).
-
Използването на променливи в таблицата в рамките на дефинирани от потребителя функции позволява тези функции да се използват по-широко (вижте документацията CREATE FUNCTION за подробности). Ако пишете функция, трябва да използвате таблични променливи вместо временни таблици, освен ако няма непреодолима нужда от друго.
-
Както променливите на таблицата, така и временните таблици се съхраняват в tempdb. Но променливите на таблици (от 2005 г.) по подразбиране използват съпоставянето на текущата база данни спрямо временните таблици, които приемат съпоставянето по подразбиране на tempdb (ref). Това означава, че трябва да сте наясно с проблемите със съпоставянето, ако използвате временни таблици и вашата база данни е различна от тази на tempdb, което причинява проблеми, ако искате да сравните данни във временната таблица с данни във вашата база данни.
-
Global Temp Tables (##tmp) са друг тип временни таблици, достъпни за всички сесии и потребители.
Още малко четене:
-
Страхотният отговор на Мартин Смит на dba.stackexchange.com
-
MSDN FAQ относно разликата между двете:https://support.microsoft.com/en-gb/kb/305977
-
Статия в блога на MDSN:https://docs.microsoft.com/archive/blogs/sqlserverstorageengine/tempdb-table-variable-vs-local-temporary-table
-
Статия:https://searchsqlserver.techtarget.com/tip/Temporary-tables-in-SQL-Server-vs-table-variables
-
Неочаквано поведение и последици за производителността на временните таблици и временните променливи:Пол Уайт на SQLblog.com