SQL Server, временные таблицы с усечением по сравнению с табличной переменной с удалением - PullRequest
6 голосов
/ 15 апреля 2010

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

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

Ответы [ 2 ]

11 голосов
/ 15 апреля 2010

При запуске подписки к сценариям может показаться, что Таблица переменных является лучшим вариантом

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

CPU     Reads   Writes  Duration
36375     2799937   0       39319

vs

CPU     Reads   Writes  Duration
14750   1700031 2       17376   
7 голосов
/ 15 апреля 2010

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

В общем

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

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

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

...