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

Откуда: СПБ
Сообщений: 34
Доброго времени суток.

2005 SQL сервер. Хранимка (достаточно простая, один селект) возвращает 13000 строк за 2 секунды если запускать её из SQL студии. При работе клиента через веб сервис и .NET provider хранимка начинает выполняться и вылетает таймаут. Повторяемость 100%.
Если в запросе хранимки выставить SELECT TOP 15000 (то есть больше чем количество возвращаемых записей) - всё начинает работать нормально.

Есть хоть какие-нибудь идеи в чём может быть проблема?
10 ноя 11, 21:29    [11578204]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
step_ks
Member

Откуда:
Сообщений: 936
сравнить SET-ы и планы.
10 ноя 11, 22:04    [11578277]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
а точнее
Guest
massaraksh33,

быстро отрабатывает если запускаете из ssms как exec <my proc> или если всё тело из нее выдергиваете?
10 ноя 11, 23:02    [11578465]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
massaraksh33
Member

Откуда: СПБ
Сообщений: 34
step_ks
сравнить SET-ы и планы.

На тестовой базе примерно с таким же количеством данных ситуация не повторяется, добавление TOP 1500 в запрос добавляет в план Top, Estimated Operator Cost 0,0013 (0%). И с топом и без топа хранимка отрабатывает за доли секунды и при работе через веб сервис и при работе через студию.

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

А как сравнить SETы?

а точнее
massaraksh33,

быстро отрабатывает если запускаете из ssms как exec <my proc> или если всё тело из нее выдергиваете?

exec <my proc>, отдельно тело не пробовали
11 ноя 11, 11:47    [11580326]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
massaraksh33
На продакшн базе с топом пашет, без топа - таймаут при работе через вебсервис. При запуске через студию пашет и с топом и без нормально. К сожалению, доступа к продакшн базе у меня на данный момент нет и посмотреть там план я не могу.
А вы несколько раз это проверяли, что это именно топ, и проверяли ли вы это при полностью одинаковых значениях параметров в хранимке?
Просто ситуация с топ может быть наводная. Например, вы добавили топ, альтернули процедуру, при следующем вызове для нее построился новый "быстрый" план, в котором, помимо топа, еще и значения параметров для которых был построен план отличаются от значений из старого "медленного" плана. Вывод - топ всех спас, хотя он не при чем (ситуация: таракан без ног не слышит).
Если же это устойчивая ситуация и топ реально помогает оптимизатору найти хороший план, то неплохо бы на него посмотреть (причем на реальный а не оценочный) в сравнении с медленным. Возможно где-то оптимизатор неверно оценил число строк из-за неактуальной статистики или еще что, надо смотреть конкретно.
11 ноя 11, 12:03    [11580503]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
massaraksh33
Member

Откуда: СПБ
Сообщений: 34
SomewhereSomehow
А вы несколько раз это проверяли, что это именно топ, и проверяли ли вы это при полностью одинаковых значениях параметров в хранимке?
Просто ситуация с топ может быть наводная. Например, вы добавили топ, альтернули процедуру, при следующем вызове для нее построился новый "быстрый" план, в котором, помимо топа, еще и значения параметров для которых был построен план отличаются от значений из старого "медленного" плана. Вывод - топ всех спас, хотя он не при чем (ситуация: таракан без ног не слышит).
Если же это устойчивая ситуация и топ реально помогает оптимизатору найти хороший план, то неплохо бы на него посмотреть (причем на реальный а не оценочный) в сравнении с медленным. Возможно где-то оптимизатор неверно оценил число строк из-за неактуальной статистики или еще что, надо смотреть конкретно.

У хранимки нет параметров, внутри она тоже никаких переменных от которых может зависеть результат не вычисляет.
Топ ставили и убирали несколько раз в течении 15 минут - стабильно с топом пашет, без топа таймаут. Статистика за это время не могла поменяться.
Кстати, текущий фикс на продакшене - это SELECT TOP 100000, пока проблем с таймаутами не возникало.

Как можно посмотреть план запроса, который строится при выполнении харанимки через вебсервис на продакшене? Ведь через студию там же она выполняется нормально, очевидно, в этом случае план тоже "нормальный".
11 ноя 11, 14:40    [11582096]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
massaraksh33
...Как можно посмотреть план запроса, который строится при выполнении харанимки через вебсервис на продакшене?..
Через профилер.
11 ноя 11, 14:45    [11582139]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
Andret
Member

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

Понятно, что в обоих случаях план разный.
Но мы же не телепаты

автор
Хранимка (достаточно простая, один селект)


Значит, этот один простой селект нужно вынести в студию, может хоть подсказку подскажем :)
11 ноя 11, 14:49    [11582181]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
SomewhereSomehow
Member

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

Я так понял у вас две среды, тестовая и боевая? Когда речь идет об оптимизации, материи очень зависящей от реальных данных, то на тестовом иногда бывает бессмысленно экспериментировать, даже если восстановил последний бэкап реальной базы, так что конечно планы и т.д. нужно сравнивать там, где есть проблемы с производительностью. Так что желательно бы видеть два разных плана "быстрый" и "медленный" с боевого сервера. Ну и конечно описание таблиц, индексов, сам запрос и т.д. Потому что "Хранимка (достаточно простая, один селект)" как-то уж очень абстрактно.
11 ноя 11, 14:57    [11582273]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
massaraksh33
Member

Откуда: СПБ
Сообщений: 34
SomewhereSomehow
massaraksh33,

Я так понял у вас две среды, тестовая и боевая? Когда речь идет об оптимизации, материи очень зависящей от реальных данных, то на тестовом иногда бывает бессмысленно экспериментировать, даже если восстановил последний бэкап реальной базы, так что конечно планы и т.д. нужно сравнивать там, где есть проблемы с производительностью. Так что желательно бы видеть два разных плана "быстрый" и "медленный" с боевого сервера. Ну и конечно описание таблиц, индексов, сам запрос и т.д. Потому что "Хранимка (достаточно простая, один селект)" как-то уж очень абстрактно.


Да, две среды. И проблемы с доступом к "боевой" :(
Сам запрос небольшой, но всё-же не совсем элементарный, придётся вытаскивать сюда вагон табличек, вьюх и индексов.

Я, честно говоря, надеялся что кто-то сталкивался с такой же ситуацией и может подсказать куда посмотреть без плана запросов. Жаль что так не получилось, придётся таки как-то добывать план.
11 ноя 11, 18:13    [11584434]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
SomewhereSomehow
Member

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

Да, дело в том, что в sql нет быстрых и медленных операторов, все зависит от ситуации, а если речь о быстродействии тут вообще - простор для фантазии, по этому, обсуждая производительность, без конкретики никак. Так что да, придется приводить и индексы, и таблицы, и вьюхи, на которые кстати надо внимательно смотреть. А то было у меня, запрячут хитрый запрос к таблице из нескольких миллионов строк без индексов во вьюху, обзовут потом ее как таблицу и показывают запрос с удивлением - а что это оно тормозит.
11 ноя 11, 18:35    [11584613]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
свои причины и свое решение
Guest
massaraksh33,

проверьте лучше что, где и с какими параметрами запускает ваш сервис.
автор
Я, честно говоря, надеялся что кто-то сталкивался с такой же ситуацией

с ситуацией "где-то что-то почему-то тупит" много кто сталкивался. в каждой такой ситуации были свои причины и свое решение.
11 ноя 11, 20:40    [11585159]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
а вы все топы
Guest
massaraksh33,

дело может вобще в блокировках. а вы все топы лепите туда-сюда.
11 ноя 11, 20:42    [11585168]     Ответить | Цитировать Сообщить модератору
 Re: TOP X kills timeout ( X > count(*) )  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
massaraksh33
Я, честно говоря, надеялся что кто-то сталкивался с такой же ситуацией и может подсказать куда посмотреть без плана запросов.

Вообще-то step_ks вам уже посоветовал сравнить set-ы в первом сообщении. Сделать это можно с помощью profiler-а, событие Existing connections, если не ошибаюсь
12 ноя 11, 15:58    [11586946]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить