В какой момент переменная таблицы должна быть оставлена ​​для временной таблицы? - PullRequest
3 голосов
/ 27 мая 2010

Есть ли счетчик строк, который делает табличную переменную неэффективной или как? Я понимаю разницу между ними, и я видел несколько разных цифр, когда эта точка достигнута, но мне любопытно, если кто-нибудь знает.

Ответы [ 2 ]

3 голосов
/ 27 мая 2010

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

этот код демонстрирует, что переменные таблицы не хранятся в журнале транзакций:

create table #T (s varchar(128)) 
declare @T table (s varchar(128)) 
insert into #T select 'old value #' 
insert into @T select 'old value @' 
begin transaction 
     update #T set s='new value #' 
     update @T set s='new value @' 
rollback transaction 
select * from #T 
select * from @T 
2 голосов
/ 27 мая 2010

Внутри таблицы переменные могут быть созданы в tempdb, а также во временных таблицах.

Они различаются только по объему и постоянству.

Вопреки распространенному мнению, операции с временными таблицами влияют на журнал транзакций, несмотря на тот факт, что они не подлежат контролю транзакций.

Чтобы проверить это, запустите этот простой запрос:

DECLARE @mytable TABLE (id INT NOT NULL PRIMARY KEY)
;
WITH    q(num) AS
        (
        SELECT  1
        UNION ALL
        SELECT  num + 1
        FROM    q
        WHERE   num <= 42
        )
INSERT
INTO    @mytable (id)
SELECT  num
FROM    q
OPTION (MAXRECURSION 0)

DBCC LOG(tempdb, -1)
GO
DBCC LOG(tempdb, -1)
GO

и просмотрите последние записи из обоих наборов записей.

В первом наборе записей вы увидите 42 LOP_INSERT_ROWS записей.

Во втором наборе записей (который находится в другом пакете) вы увидите 42 LOP_DELETE_ROWS записей.

Они являются результатом выхода табличной переменной из области видимости и удаления ее записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...