Цитата, взята з; Професійні внутрішні системи та усунення несправностей у SQL Server 2012
Статистика
Основна відмінність тимчасових таблиць від табличних змінних полягає в тому, що статистика не створюється на табличних змінних. Це має два основні наслідки, першим з яких є те, що оптимізатор запитів використовує фіксовану оцінку кількості рядків у змінній таблиці незалежно від даних, які вона містить. Крім того, додавання або видалення даних не змінює оцінку.
Індекси Не можна створювати індекси на змінних таблиці, хоча ви можете створювати обмеження. Це означає, що, створюючи первинні ключі або унікальні обмеження, ви можете мати індекси (оскільки вони створені для підтримки обмежень) на змінних таблиці. Навіть якщо у вас є обмеження, а отже, індекси, які матимуть статистику, індекси не використовуватимуться при складанні запиту, оскільки вони не існуватимуть під час компіляції, а також не спричинять рекомпіляції.
Модифікації схеми Модифікації схеми можливі у тимчасових таблицях, але не у змінних таблиць. Хоча модифікації схем можливі у тимчасових таблицях, уникайте їх використання, оскільки вони викликають перекомпіляцію операторів, які використовують таблиці.
ТАБЛИЧНІ ВАРІАБЛІ НЕ СТВОРЕНІ В ПАМ'ЯТІ
Існує поширене неправильне уявлення про те, що змінні таблиці є структурами пам'яті, і як такі вони будуть працювати швидше, ніж тимчасові таблиці . Завдяки DMV під назвою sys. dm _ db _ сесія _ простір _ використання, яке показує використання tempdb за сеансом, ви можете довести, що це не так . Після перезапуску SQL Server для очищення DMV запустіть наступний скрипт, щоб переконатися, що ваш сеанс _ id повертає 0 для користувача _ об’єктів _ alloc _ сторінки _ кількість:
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;
Тепер ви можете перевірити, скільки місця використовує тимчасова таблиця, запустивши наступний скрипт, щоб створити тимчасову таблицю з одним стовпцем і заповнити її одним рядком:
CREATE TABLE #TempTable ( ID INT ) ;
INSERT INTO #TempTable ( ID )
VALUES ( 1 ) ;
GO
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;
Результати на моєму сервері вказують на те, що таблиці було виділено одну сторінку в tempdb. Тепер запустіть той самий сценарій, але цього разу використовуйте змінну таблиці:
DECLARE @TempTable TABLE ( ID INT ) ;
INSERT INTO @TempTable ( ID )
VALUES ( 1 ) ;
GO
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;
Який використовувати?
Незалежно від того, чи використовуєте ви тимчасові таблиці чи змінні таблиці, слід вирішити ретельним тестуванням, але найкраще схилятися до тимчасових
таблиць за замовчуванням, оскільки є набагато менше речей, які можуть піти
не так .
Я бачив, як клієнти розробляли код за допомогою змінних таблиць, тому що вони мали справу з невеликою кількістю рядків, і це було швидше, ніж тимчасова таблиця, але через кілька років у змінній таблиці було сотні тисяч рядків, і продуктивність була жахлива , тому спробуйте дозволити планування потужностей під час прийняття рішення!