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

Откуда:
Сообщений: 84
Есть хранимая процедура, которая принимает набор параметров и раскидывает их по нескольким связанным таблицам. Померил производительность, приуныл, поэкспериментировал, в конце концов переписал код практически 1-в-1 на trigger instead of insert, который повешен на view над этими же таблицами. Разница на моем дохлом ноуте - 500 инсертов в секунду в хранимой процедуре против 3500-4000 в секунду в триггере. ЧЯДНТ и чем теоретически объясняется такой разброс?
ХП мне милее из соображений безопасности, да и бизнес-логику в ней держать как-то привычнее чем в триггере.
28 дек 16, 21:41    [20058236]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37067
Типа, за секунду 500 транзакций работает дольше, чем одна на вставку 4к записей?

З.Ы. Bulk- или минимально логируемая вставка вообще может поравать шаблон по скорости.

Сообщение было отредактировано: 28 дек 16, 22:31
28 дек 16, 22:29    [20058350]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
pbda
Member

Откуда:
Сообщений: 84
Транзакция одна на цикл.

В обоих случаях работает SqlDataAdapter в Batch-режиме, у которого в первом случае InsertCommand имеет тип StoredProcedure, во втором - Text, а команды на сервер улетают построчно в обоих случаях, если верить профайлеру.

Разница в том, что в ХП делается один инсерт на вызов ХП, в триггере выполняется псевдобатч типа insert into T(a, b, c) ... select a, b, c from inserted.

Неужели именно это в 8-10 раз режет производительность? Ужос.
28 дек 16, 22:42    [20058376]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37067
pbda
Ужос.
Ага, вообще не понятно, как дальше жить-то после такого. Неужели писать одну процедуру на обработку сразу большого кол-ва запсией?

Сообщение было отредактировано: 28 дек 16, 22:45
28 дек 16, 22:44    [20058381]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
pbda
Member

Откуда:
Сообщений: 84
Если имеются в виду table-valued parameters, то я про них в курсе, просто не вижу принципиальной разницы между ХП, которая принимает табличный параметр и, в моем случае, триггером на instead of insert на представлении. В обоих случаях команды на сервер ADO.NET будет отправлять построчно, в обоих случаях вставка в физическую таблицу будет производиться из временных таблиц батчем, а обрабатывать для проверки бизнес-логики что табличный параметр, что inserted курсором всяко неудобнее, чем скалярные параметры ХП :(
28 дек 16, 23:01    [20058413]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37067
Inserted курсором? Табличный параметр курсором? Однако, мсье знает толк в извращениях.

З.Ы. Тут вам не оракл, забудьте о курсорах.
28 дек 16, 23:04    [20058420]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
pbda
Транзакция одна на цикл.
Управление транзакциями из приложения может сильно уменьшить скорость.

pbda
Если имеются в виду table-valued parameters, то я про них в курсе, просто не вижу принципиальной разницы между ХП, которая принимает табличный параметр и, в моем случае, триггером на instead of insert на представлении. В обоих случаях команды на сервер ADO.NET будет отправлять построчно, в обоих случаях вставка в физическую таблицу будет производиться из временных таблиц батчем, а обрабатывать для проверки бизнес-логики что табличный параметр, что inserted курсором всяко неудобнее, чем скалярные параметры ХП :(
Лучше делать не циклами "построчно", а операциями надо множествами, для чего SQL как раз хорошо заточен.
Одной командой передать множество в процедуру, там проверить бизнес-логику (так же, как сейча, но не построчно, а оперируя множествами), и вставить в постоянные таблицы.
Транзакцией управлять из процедуры.
Будет быстро.
Ну и ещё быстрее - 20058350, хотя это уже менее удобно программировать. Но зато от тысяч строк в сек можно перейти к сотням тысяч.
28 дек 16, 23:30    [20058452]     Ответить | Цитировать Сообщить модератору
 Re: Производительность на вставку  [new]
pbda
Member

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

пасиба, принцип понял.

Гавриленко Сергей Алексеевич,

Про Oracle угадали (
28 дек 16, 23:38    [20058463]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить