Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
invm
Member

Откуда: Москва
Сообщений: 8797
Как посмореть транзакцию на табличную переменную (а то некоторые упертые личности могут счесть картинку не показательной):
use tempdb;

declare @t table ([@t_column1] int);

select
 object_name(object_id)
from
 sys.columns
where
 name = N'@t_column1';

declare @c nvarchar(30), @x nvarchar(30);
select @c = max([Current LSN]) from sys.fn_dblog(null, null);

insert into @t values (1);
select @x = [Transaction ID] from sys.fn_dblog(null, null) where [Current LSN] > @c and SPID = @@spid and [Transaction Name] = N'TVQuery' and Operation = N'LOP_BEGIN_XACT';

select * from sys.fn_dblog(null, null) where [Transaction ID] = @x;
4 июн 15, 12:41    [17729751]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
PVA
Member

Откуда: Питер
Сообщений: 22
Еще информация по теме
http://www.sqlservercentral.com/articles/Temporary Tables/66720/
4 июн 15, 13:38    [17730130]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 276
Тема конечно холиварная.

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

Код получился очень громоздкий.
Решил переписать с использованием временных таблиц и разбить на несколько процедур - чтобы проще код смотреть было.

В итоге на временных таблицах работает быстрее, примерно на треть.

Почитал тут обсуждение - рекомендуют использовать табличную переменную в случаях, когда нужно хранить 100 записей и менее.

В остальных случаях лучше использовать временные таблицы.
8 окт 19, 16:47    [21989661]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6612
Александр Бердышев,

вот прям новость, но с какого-то... 2012-14 статистика внутри табличных переменных уже адекватна
8 окт 19, 18:03    [21989741]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
fkthat
Member

Откуда:
Сообщений: 1340
Табличная переменная, в отличии от временной таблицы не ведет статистику и не участвует в явной транзакции (если есть явнвя транзакция). Возможно дело в этом.
8 окт 19, 18:48    [21989782]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
0wl
Member

Откуда:
Сообщений: 51
TaPaK,

Не совсем. Начиная с 2014 сиквел считает, что в табличной переменной не одна строка, а 100. Иногда действительно выручает. Плюс, появился флаг 2453, который приводит к перекомпиляции плана с учетом данных от предыдущего выполнения запроса.

В 2019 обещают светлое будущее и более адекватную статистику для переменных.
8 окт 19, 18:49    [21989785]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6612
0wl
TaPaK,

Не совсем. Начиная с 2014 сиквел считает, что в табличной переменной не одна строка, а 100. Иногда действительно выручает. Плюс, появился флаг 2453, который приводит к перекомпиляции плана с учетом данных от предыдущего выполнения запроса.

В 2019 обещают светлое будущее и более адекватную статистику для переменных.

Что за фантазии всем пунктам
8 окт 19, 22:19    [21989906]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32231
Блог
TaPaK
Александр Бердышев,

вот прям новость, но с какого-то... 2012-14 статистика внутри табличных переменных уже адекватна


Неужели ms нам врет? )


https://docs.microsoft.com/en-us/sql/t-sql/data-types/table-transact-sql?view=sql-server-2017
Table variables don't have distribution statistics
8 окт 19, 22:47    [21989922]     Ответить | Цитировать Сообщить модератору
 Re: почему @табличная переменная работает быстрей чем #временная таблица на INSERT?  [new]
0wl
Member

Откуда:
Сообщений: 51
TaPaK,
Да [url="https://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server"]фантазеров [/url][url="https://www.mssqltips.com/sqlservertip/5662/table-variable-deferred-compilation-in-sql-server/ "]всяких [/url]начитался

Про 100 строк -- каюсь, не нашёл (хотя в планах, помню, видел. Но пруфов под рукой нет, спишем на усталость зрения)

Но факт в том, что главное, почему "в 2012-2014" статистика (точнее предполагаемое число строк) может быть "адекватна" -- это флаг 2453
9 окт 19, 10:46    [21990153]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Microsoft SQL Server Ответить