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

Откуда: Прага
Сообщений: 247
День добрый!

Сегодня попал на странное поведение SP, которое заключается в следующем:

Есть есть некий последовательный расчёт цен, который курсором прогоняется для разных входных условий.

Т.е. условно:

for(int i;i<10;i++)
{
exec sp @param = i;
}


Была идея этот механизм заменить на следующую конструкцию:

for(int i;i<10;i++)
{
[sp_add_job] @command='sp @param = i';
[sp_start_job]
}

while exists(SELECT * FROM msdb.dbo.sysjobs R INNER JOIN @joblist J ON R.name=J.jobid)
begin
WAITFOR DELAY '00:00:05'
end

select 'its over'


Что и было сделано. По-идее за счет распараллеливания общее время должно было сократиться, однако ситуация обратная - оно увеличилось. Может есть какие-то подводные камни и я что-то пропустил?

PS: сорри за смесь новогородского с французским
10 дек 13, 18:51    [15273431]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Блокировки вы пропутили. Ну и "за счет распараллеливания общее время должно было сократиться" верно только в случае, если вы делаете какие-то операции, которые не могут параллелиться самим сервером. Во всех остальных случаях запросто может стать хуже.
10 дек 13, 18:53    [15273443]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Гавриленко Сергей Алексеевич,

видимо вы правы, насчет блокировок. Вычисления с общими данными выглядят так:

- чтение из общей таблицы

- обработка данных (во временных таблицах)

- сохранение данных в общие таблицы

В принципе на всех этапах работы SP в job-ах могут быть блокировки. Есть шанс их обойти? Смысл в WITH (NOLOCK) есть?
10 дек 13, 19:12    [15273513]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Включить read committed snapshot, например.
10 дек 13, 19:15    [15273526]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
cavalero
Смысл в WITH (NOLOCK) есть?
Только если обработка устроена так, что не может читать искажённые другими потоками обработки данные.

cavalero
Есть шанс их обойти?
NOLOCK и максимально короткие транзакции, т.е. сначала готовим данные в каких то верменных таблицах, потом их сохраняем. Не делать INSERT/UPDATE/DELETE с сложными запросами, сначала данные во времянки, потом уже сохранять. Не делать всё в общей транзакции либо использовать snapshot.

Ну и нужно конечно убедиться, что распараллеливание даст выйгрыш, может дело не в блокировках.
10 дек 13, 19:40    [15273606]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Гавриленко Сергей Алексеевич
Включить read committed snapshot, например.


При включении разница в миллисекунды,общую картину не меняет.
10 дек 13, 19:46    [15273630]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
alexeyvg
cavalero
Смысл в WITH (NOLOCK) есть?
Только если обработка устроена так, что не может читать искажённые другими потоками обработки данные.

cavalero
Есть шанс их обойти?
NOLOCK и максимально короткие транзакции, т.е. сначала готовим данные в каких то верменных таблицах, потом их сохраняем. Не делать INSERT/UPDATE/DELETE с сложными запросами, сначала данные во времянки, потом уже сохранять. Не делать всё в общей транзакции либо использовать snapshot.

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



Да, по такому прицнипу всё и работает, все тяжелые операции выполняются во временных таблицах, а чтение и запись только в начале и в конце алгоритма соответственно.

Честно говоря, немного удивлен такому результату, т.к. при "параллельном выполнении" загружены все 12 CPU (по Task Manager), а при "последовательном" только 1 и на меньшее время.
10 дек 13, 19:51    [15273654]     Ответить | Цитировать Сообщить модератору
 Re: Параллельное выполнение  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
Нашёл одну таблицу, на которую могли накладываться блокировки и заменил ее на временную таблицу.
Эффект на лицо, как говорится. При увеличении количества параллельно выполняемых процедур общее время выполнения не увеличивается.
Всем спасибо за помощь!
10 дек 13, 21:02    [15273900]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить