Цитата взята из; Professional SQL Server 2012 Внутреннее устройство и устранение неполадок
Статистика Основное различие между временными таблицами и табличными переменными заключается в том, что статистика не создается для табличных переменных. Это имеет два основных последствия, первое из которых состоит в том, что оптимизатор запросов использует фиксированную оценку количества строк в табличной переменной независимо от содержащихся в ней данных. Более того, добавление или удаление данных не влияет на оценку.
Индексы. Вы не можете создавать индексы для табличных переменных, хотя можете создавать ограничения. Это означает, что, создавая первичные ключи или уникальные ограничения, вы можете иметь индексы (поскольку они созданы для поддержки ограничений) для табличных переменных. Даже если у вас есть ограничения и, следовательно, индексы, которые будут иметь статистику, индексы не будут использоваться при компиляции запроса, потому что они не будут существовать во время компиляции и не вызовут перекомпиляции.
Модификации схемы. Изменения схемы возможны для временных таблиц, но не для табличных переменных. Хотя для временных таблиц возможны модификации схемы, избегайте их использования, поскольку они вызывают перекомпиляцию операторов, использующих таблицы.
ТАБЛИЧНЫЕ ПЕРЕМЕННЫЕ НЕ СОЗДАЮТСЯ В ПАМЯТИ
Существует распространенное заблуждение, что переменные таблицы являются структурами в памяти и поэтому работают быстрее, чем временные таблицы. Благодаря DMV под названием sys. dm _ db _ session _ space _ usage, который показывает использование tempdb для каждого сеанса, вы можете доказать, что это не так. После перезапуска SQL Server для очистки DMV запустите следующий сценарий, чтобы убедиться, что ваш идентификатор сеанса возвращает 0 для user _ objects _ alloc _ page _ count:
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 ;
Какой из них использовать?
Независимо от того, используете ли вы временные таблицы или табличные переменные, следует решить путем тщательного тестирования, но лучше всего использовать временные таблицы по умолчанию, потому что гораздо меньше вещей, которые можно выполнить strong > неправильно.
Я видел, как заказчики разрабатывали код с использованием табличных переменных, потому что они имели дело с небольшим количеством строк, и это было быстрее, чем временная таблица, но несколько лет спустя в табличной переменной были сотни тысяч строк, и производительность была ужасной. , так что постарайтесь предусмотреть некоторое планирование мощности, когда будете принимать решение!
person
Teoman shipahi
schedule
04.09.2015