SQL Server, временные таблицы с усеченным по сравнению с табличной переменной с удаляют

У меня есть хранимая процедура внутри, которая я составляю временную таблицу, которая обычно содержит между 1 и 10 строками. Эта таблица является усеченной и заполняется много раз во время хранимой процедуры. Это является усеченным, поскольку это быстрее, чем удаляют. Сделайте я получаю любое увеличение производительности путем замены этой временной таблицы табличной переменной, когда я получаю штраф для использования, удаляют (усеченный, не работает над табличными переменными),

Пока табличные переменные находятся главным образом в памяти и обычно быстрее, чем временные таблицы, я освобождаю какое-либо преимущество при необходимости удалить, а не усечь?

7
задан marc_s 15 April 2010 в 15:59
поделиться

2 ответа

Выполнение следующего сценария показывает, что переменная таблицы - лучший вариант

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   
12
ответ дан 6 December 2019 в 09:18
поделиться

Откровенно говоря, всего 10 или 20 (или даже 100) записей, любая разница в скорости будет в области субнаносекунд. Забудьте об этом - не тратьте на это ни секунды своего мозгового времени - это не проблема!

Обычно

  • переменные таблицы будут храниться в памяти до определенного размера - если они превышают этот размер, они также выгружаются на диск в базе данных tempdb - точно так же, как временные таблицы. . Плюс: если во временной таблице есть только несколько записей, они все равно будут храниться на одной странице размером 8k, и как только вы получите доступ к одной из записей, вся эта страница (и, следовательно, вся временная таблица) будет находиться в памяти SQL Server - так что даже здесь у табличных переменных действительно не так много преимуществ ...

  • табличные переменные не поддерживают индексы и статистику, что означает, что у вас есть больше, чем несколько записей, и особенно если вам нужно искать и запрашивать эту «сущность», вам лучше использовать временную таблицу

В общем: я лично использую временные таблицы чаще, чем переменные таблицы, особенно если у меня более 10 записей или что-то подобное. Возможность индексировать временную таблицу и иметь по ней статистику обычно окупается по сравнению с любым потенциальным выигрышем, который может иметь табличная переменная с точки зрения производительности.

8
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: