У меня есть хранимая процедура внутри, которая я составляю временную таблицу, которая обычно содержит между 1 и 10 строками. Эта таблица является усеченной и заполняется много раз во время хранимой процедуры. Это является усеченным, поскольку это быстрее, чем удаляют. Сделайте я получаю любое увеличение производительности путем замены этой временной таблицы табличной переменной, когда я получаю штраф для использования, удаляют (усеченный, не работает над табличными переменными),
Пока табличные переменные находятся главным образом в памяти и обычно быстрее, чем временные таблицы, я освобождаю какое-либо преимущество при необходимости удалить, а не усечь?
Выполнение следующего сценария показывает, что переменная таблицы - лучший вариант
CREATE TABLE #Temp(
ID INT
)
DECLARE @Int INT,
@InnerInt INT
SELECT @Int = 1,
@InnerInt = 1
WHILE @Int < 50000
BEGIN
WHILE @InnerInt < 10
BEGIN
INSERT INTO #Temp SELECT @InnerInt
SET @InnerInt = @InnerInt + 1
END
SELECT @Int = @Int + 1,
@InnerInt = 1
TRUNCATE TABLE #Temp
END
DROP TABLE #TEMP
GO
DECLARE @Temp TABLE(
ID INT
)
DECLARE @Int INT,
@InnerInt INT
SELECT @Int = 1,
@InnerInt = 1
WHILE @Int < 50000
BEGIN
WHILE @InnerInt < 10
BEGIN
INSERT INTO @Temp SELECT @InnerInt
SET @InnerInt = @InnerInt + 1
END
SELECT @Int = @Int + 1,
@InnerInt = 1
DELETE FROM @Temp
END
Из Sql Profiler
CPU Reads Writes Duration
36375 2799937 0 39319
vs
CPU Reads Writes Duration
14750 1700031 2 17376
Откровенно говоря, всего 10 или 20 (или даже 100) записей, любая разница в скорости будет в области субнаносекунд. Забудьте об этом - не тратьте на это ни секунды своего мозгового времени - это не проблема!
Обычно
переменные таблицы будут храниться в памяти до определенного размера - если они превышают этот размер, они также выгружаются на диск в базе данных tempdb
- точно так же, как временные таблицы. . Плюс: если во временной таблице есть только несколько записей, они все равно будут храниться на одной странице размером 8k, и как только вы получите доступ к одной из записей, вся эта страница (и, следовательно, вся временная таблица) будет находиться в памяти SQL Server - так что даже здесь у табличных переменных действительно не так много преимуществ ...
табличные переменные не поддерживают индексы и статистику, что означает, что у вас есть больше, чем несколько записей, и особенно если вам нужно искать и запрашивать эту «сущность», вам лучше использовать временную таблицу
В общем: я лично использую временные таблицы чаще, чем переменные таблицы, особенно если у меня более 10 записей или что-то подобное. Возможность индексировать временную таблицу и иметь по ней статистику обычно окупается по сравнению с любым потенциальным выигрышем, который может иметь табличная переменная с точки зрения производительности.