добавив индекс, время выполнения снизилось с 2,5 сек до 50мс)
В итоге под нагрузкой на базе этот запрос по-прежнему выполняется > 3 секунд, вижу его через Activity Monitor - Active Exp Queries (CPU и Elapsed больше 3000ms всегда)
Но самая запара в том, что если из Активити Монитора выдернуть этот запрос и запуститЬ, то длительность выполнения все те же 50 мс
Почему тот же самый запрос от беков может выполняться несколько секунд, а если выполнять самому 50 мс?
Параметры в предикат ставлю разные от запуска к запуску
Потому что планы выполнения разные
в sys.dm_exec_cached_plans только один план есть
Чудес не бывает. Что для этого запроса в sys.dm_exec_query_stats?
тут два, первый - тот что я выполняю из студии (где все быстро), второй - тот что беки отправляют
Планы вытаскиваются?
да, вот как раз достаю их, буду сравнивать сейчас
планы запросов действительно разные((
хотя запросы одинаковые, единственная разница, что я подставляю параметр сам, а в запросе от беков есть (@P0 bigint)
https://www.mssqltips.com/sqlservertip/3257/different-approaches-to-correct-sql-server-parameter-sniffing/
Опции компиляции плана (в свойствах корневого элемента) одинаковые?
а где смотреть? в Properties - Set Options? там только ARITHABORT отличаются
Да, там. Скорее всего это и есть причина проблемы.
а где True, где False имеет значение? у меня в быстром плане True, в медленном False - так и должно быть?
Конечно имеет. Set Options - набор опций, от которых зависит форма плана
попробовал добавить перед запросом SET ARITHABORT ON/OFF - не влияет, в обоих случаях быстро
Надо либо отдельным батчем, либо в запрос добавить option (recompile)
попробовал из студии сделать параметризацию (DECLARE @P0 AS bigint = 10), и теперь запрос стал работать медленно, наверное в моем случае дело все же в параметризации
Возможно и то, и другое.
Это почти всегда поможет, но это скорее всего худший способ решить проблему
а что есть хороший способ? пересбор статистики?
Надо смотреть подробно, что там с параметрами
Очень интересно узнать способ лучше
Можно удалить план например, но в будущем проблема может повторится
Самое простое - обернуть запрос в ХП или выполнять через sp_executesql. Тогда значение параметра будет учтено при построении плана. Только это не поможет, если проблема действительно в parameters sniffing.
Сниффинг палка о нескольких концах, чтобы вслепую предполагать, что может помочь в конкретном случае. Иногда банально переопределить параметры фиктивно в начале процедуры может сработать.
Чуть лучше optimize for
Обсуждают сегодня