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

Откуда:
Сообщений: 42
MS SQL Server 2008 R2 EE x64

Подскажите, как определить из-за чего (куда копать) стократно возрастают, как будто вспыхивают, счетчики reads/duration/cpu при вызове процедуры, основанной на select с left outer join. По двум основным таблицам запроса (из 8) почти постоянно добавляются и меняются данные: 200 тысяч строк и 1000 строк в день, соответственно

Обычно процедура отрабатывает за 300-500 мкс, и reads примерно равен трем тысячам,
но через каждые 5-10-20 вызовов процедура тормозит,
т.е. отрабатывает за 10 000 - 300 000 мкс и количество чтений увеличивается с 3 тысяч до 4-6 млн.

Процедура выполняется примерно 1-2 тысячи раз в день.

В настоящее время удалось добиться более стабильной работы благодаря добавке к запросу: OPTION (MAXDOP 1)
Раньше, без этой опции, запрос распараллеливался (из-за left outer join), при этом не применялись нужные индексы и были ужасные тормоза.
Также я добавил хинты tablock и with(index(...)) на некоторые таблицы - в два-три раза полегчало для типичного набора входных параметров.

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

Скрин профайлера прилагаю...

К сообщению приложен файл. Размер - 148Kb
16 апр 13, 22:06    [14189524]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
По двум основным таблицам запроса (из 8) почти постоянно добавляются и меняются данные: 200 тысяч строк и 1000 строк в день, соответственно


И как часто проводятся регламентные работы по апдейту статистики, реорганайзу и ребилду индексов?

автор
Подскажите, как определить из-за чего (куда копать) стократно возрастают, как будто вспыхивают, счетчики reads/duration/cpu при вызове процедуры, основанной на select с left outer join


Ну так отловите планы для "быстрого" и "медленного" вариантов. Судя по различиям time и IO отличия будут видны невооруженным взглядом.

автор
В настоящее время удалось добиться более стабильной работы благодаря добавке к запросу: OPTION (MAXDOP 1)


Еще один звоночек в сторону того, что план меняется и сваливается в параллелизм... Возможно, придется хинтовать еще и способ объединения.

автор
Также я добавил хинты tablock и with(index(...)) на некоторые таблицы


Ну, если еще хинты с указанием индекса возможно допустить, но вот TABLOCK... IMHO, Вы боритесь со следствиями, а не с причинами.
16 апр 13, 22:14    [14189541]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34014
Блог
MkSim,

возможно, план другой в плохих случаях
16 апр 13, 22:15    [14189543]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
MkSim
Member

Откуда:
Сообщений: 42
Статистики каждую ночь апдейчу. Индесы ребилдю раз в месяц.
А какие рекомендации по ребилду?
16 апр 13, 22:25    [14189570]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34014
Блог
MkSim,

вот еще может поможет:
https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/
16 апр 13, 22:30    [14189586]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
MkSim
Member

Откуда:
Сообщений: 42
pkarklin
Ну так отловите планы для "быстрого" и "медленного" вариантов. Судя по различиям time и IO отличия будут видны невооруженным взглядом.


Спасибо!
Вот я идиот - сам не догадался!

А какие лучше взять Events для этого? Сильно ли сбор такой статистики повлияет на систему?
16 апр 13, 22:30    [14189588]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
MkSim,

автор
А какие лучше взять Events для этого?


Об ивентах читать здесь: http://msdn.microsoft.com/en-us/library/ms190233(v=sql.105).aspx

автор
Сильно ли сбор такой статистики повлияет на систему?


Фильтры настройте, хотя бы на пользователя. Влияние может быть, но трассу вы можете остановить в любой момент.
16 апр 13, 22:40    [14189617]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
MkSim
Статистики каждую ночь апдейчу.


Как и какую?

MkSim
Индесы ребилдю раз в месяц.


Рекомендации тут простые. Процент фрагментации. Раз месяц для транзакционной системы (если я ничего не напутал) - это слишком редко. Но, в любом случае, анализируйте фрагментацию.
16 апр 13, 22:42    [14189621]     Ответить | Цитировать Сообщить модератору
 Re: Поечему периодически увеличиваются reads/duration при вызове процедуры  [new]
MkSim
Member

Откуда:
Сообщений: 42
pkarklin
Как и какую?


EXEC sp_updatestats
17 апр 13, 14:08    [14192762]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить