Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
randrews
Member

Откуда:
Сообщений: 44
Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T
в чем может быть такое поведение ?
Скрипты абсолютно одинаковые, первый раз вставляю напрямую в табличную переменную @T.
Второй раз через временную #T.
Первый вариант скрипта отрабатывает в 10 раз медленнее второго.

1.
       
insert into @StockIdoc([WERKS],[LGORT],[IDOCNo],[StockType])
             SELECT distinct I.[WERKS],@LGORT as LGORT, max(I.[IDOCNo]) as IDOCNo,@StockType as StockType
             FROM [dbo].[INVRPT] I 
             left join @FPlants F on F.Code = I.[WERKS]
             where  
                          (I.[StockType] is null    or [StockType] = @StockType)
                    and    I.[LGORT] = @LGORT        
                    and (@PlantFilter = ''           or F.Code is not null)
             group by I.[WERKS]


2. То же самое, только сначала вставим все во временную таблицу #T
    
             SELECT distinct I.[WERKS],@LGORT as LGORT, max(I.[IDOCNo]) as IDOCNo,@StockType as StockType
             into #T
             FROM [dbo].[INVRPT] I 
             left join @FPlants F on F.Code = I.[WERKS]
             where  
                          (I.[StockType] is null    or [StockType] = @StockType)
                    and    I.[LGORT] = @LGORT        
                    and (@PlantFilter = ''           or F.Code is not null)
             group by I.[WERKS]


              insert into @StockIdoc([WERKS],[LGORT],[IDOCNo],[StockType])
              select WERKS ,LGORT ,IDOCNo      ,StockType from #T
17 дек 14, 17:53    [17012349]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
randrews
Member

Откуда:
Сообщений: 44
P.S.
distinct - вижу, что лишний, но не в этом суть
17 дек 14, 17:56    [17012368]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Glory
Member

Откуда:
Сообщений: 104760
randrews
Первый вариант скрипта отрабатывает в 10 раз медленнее второго.

Дедушкиными командирскими часами замеряли ? И именно ту фазу запроса, в которой происходит добавление записенй ? И на своем личном лаптопе ?
17 дек 14, 18:30    [17012562]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
А если их запустить в обратном порядке?
17 дек 14, 18:33    [17012588]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
randrews
Member

Откуда:
Сообщений: 44
Glory, замерял через getdate() и datediff.
Ну и print разницы.

Остальной скрипт не тащил, оставил только ту часть, которая после изменения стала показывать время с 325 мс до 3000 мс.
17 дек 14, 19:10    [17012812]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
randrews
Member

Откуда:
Сообщений: 44
Всем. Спасибо.
В общем, оставил через #T вариант, ибо быстрее.
Просто так и не смог понять логики. Для 10 строк мне казалось должно работать быстре с перменной.
17 дек 14, 19:14    [17012829]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
randrews,

Репро можете дать? Т.е. воспроизвести ситуацию?
План смотрели? Уверены что это именно вставка а не выборка? Может быть планы разные, например, в случае вставки в табличную переменную план не параллельный, а в случае вставки во временную таблицу - параллельный.
17 дек 14, 19:31    [17012919]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Glory
Member

Откуда:
Сообщений: 104760
randrews
Glory, замерял через getdate() и datediff.
Ну и print разницы.

И как вам удалось отдельно замерить именно "10 записей вставляется" ?
17 дек 14, 19:35    [17012945]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
randrews
Всем. Спасибо.
В общем, оставил через #T вариант, ибо быстрее.
А зачем вам вообще в переменную? Оставляйте во временной таблице.
randrews
Для 10 строк мне казалось должно работать быстре с перменной.
Почему вы думаете что переменная должна быть быстрее чем таблица?
18 дек 14, 01:15    [17014361]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
SomewhereSomehow
randrews,

Репро можете дать? Т.е. воспроизвести ситуацию?
План смотрели? Уверены что это именно вставка а не выборка? Может быть планы разные, например, в случае вставки в табличную переменную план не параллельный, а в случае вставки во временную таблицу - параллельный.
Там 100% тормозит выборка, а не вставка. Проходили уже такое. При использовании переменной, даже если эта переменная в insert into (что по идее не должно влиять), у сервера срывает крышу и он начинает генерить совсем другой план.
18 дек 14, 01:18    [17014365]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
randrews,

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

что тут конкретно происходит я затрудняюсь сказать
это надо моделировать в разных вариантах
планы смотреть, может какие ключи надо добавить или еще чего
на время смотреть надо через трейс, а не с секундомером :-)
(с getdate там слишком много чего намешивается)
но в общем случае вот обнаружив такой эффект сразу начинать его везде использовать
это однозначно плохая практика
18 дек 14, 01:53    [17014399]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
leov
теперь чаще предпочитаю использовать именно переменные
потому как таблицы подвержены откатам транзакций, логируются и пр...
Операции с табличными переменными логируются точно также.
А то, что они не "подвержены откатам транзакций", так это только минус.
18 дек 14, 05:31    [17014460]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
leov
в какой-то период у меня тоже складывалось впечатление
что временные таблицы работают чуток быстрее чем табличные переменные

Такое в определнных ситуациях действительно имеет место быть: https://www.sql.ru/forum/1041438/table-peremennaya-index-scan
Хотя, разумеется, это не случай данной темы.
18 дек 14, 06:19    [17014475]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Ruuu
Операции с табличными переменными логируются точно также.
даже не понимаю как это можно подтвердить?
типа закрутить какой-то цикл инсертов и апдейтов табличной переменной и посмотреть влияние этого на лог базы?
вы пробовали?
Ruuu
А то, что они не "подвержены откатам транзакций", так это только минус.
ну с какой-то стороны может и полезно было бы чтобы все вело себя однородно
но в принципе если понимаешь то такое поведение можно с пользой использовать
18 дек 14, 07:18    [17014513]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
leov
Ruuu
Операции с табличными переменными логируются точно также.
даже не понимаю как это можно подтвердить?
типа закрутить какой-то цикл инсертов и апдейтов табличной переменной и посмотреть влияние этого на лог базы?
вы пробовали?
Можно написать и тест, если есть желание.
А можно в документации прочитать, хотя там и не сильно подробно расписано:
http://msdn.microsoft.com/en-us/library/ms175010(v=sql.105).aspx
Transactions involving table variables last only for the duration of an update on the table variable. Therefore, table variables require less locking and logging resources.
18 дек 14, 07:37    [17014536]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Павел-П
Member

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

К сожалению, очень часто большие проблемы доставляет то, что оптимизатор строит план исходя из предположния, что в табличной переменной только одна запись. И с этим приходится бороться.
18 дек 14, 11:38    [17015509]     Ответить | Цитировать Сообщить модератору
 Re: Интеерсный эффект. 10 записей вставляется в таблицу #T быстрее, чем в @T  [new]
Павел-П
Member

Откуда:
Сообщений: 234
leov
наработались какие-то методики, индексы на них и пр...


Как я знаю, supports Non-Unique Clustered and Non-Clustered Indexes for Table Variables появился только в SQL Server 2014
18 дек 14, 11:40    [17015529]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить