Производительность SQL Server - выполнение специальных запросов по сравнению с компиляцией в хранимой процедуре - PullRequest
2 голосов
/ 04 февраля 2010

Есть ли логическая причина, по которой хранимая процедура будет работать очень медленно (> 60 секунд), но если я выполню тот же код, что и обычный скрипт SQL, он будет выполнен менее чем за 3 секунды?

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

Ситуация такова, что мой клиент сообщил о медленном запуске SP, что я подтвердил, поэтому я добавил индекс, запустилкод вне SP, и он работает фантастически быстро, но затем я перезапустил SP, и он не улучшился.

Я также удалил и заново создал SP на всякий случай, но почему-то кажется, что это можетиспользовать старый план выполнения каждый раз, когда SP запускается ??

Ответы [ 3 ]

2 голосов
/ 04 февраля 2010

Это, вероятно, проблема с планом выполнения в кэше. Я видел, как это происходило довольно часто, когда хранимая процедура истекает, но запуск того же SQL из анализатора запросов немедленно возвращается. Два простых способа, которые я знаю, чтобы исправить это на данный момент:

Очистить кэш выполнения

Это удалит плохой кэшированный план с сервера (вместе со всем остальным). Не совсем долгосрочное решение, так как хранимая процедура, вероятно, снова будет иметь проблему в будущем, но это хорошее временное решение.

DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

Добавить WITH RECOMPILE к хранимой процедуре

CREATE PROCEDURE MyExample
WITH RECOMPILE
AS ...

Добавление параметра WITH RECOMPILE к хранимой процедуре заставляет SQL Server создавать новый план выполнения при каждом запуске процедуры. Это ухудшит производительность, но определенно лучше нанести небольшой удар по производительности, чем запускать всю процедуру в тысячи раз медленнее или по таймауту, как раньше.

Параметр Sniffing

Взгляните на эту статью , посвященную анализу параметров в хранимых процедурах. Согласно статье, вы можете немного изменить код хранимой процедуры, чтобы отключить анализ параметров MS SQL, что также может помочь решить проблему.

2 голосов
/ 04 февраля 2010

может быть сниффингом параметра или может быть вызван процесс с установкой ARITHABORT на OFF

можете показать код?

0 голосов
/ 04 февраля 2010

Для хранимых процедур кэшируется один план выполнения. Если процедура основана на параметрах, то, как правило, выдает совершенно разные результаты / шаблоны поиска, возможно, для решения запроса процедуры использовался неоптимальный кэшированный план выполнения.

Некоторые способы исправить:

Используйте WITH RECOMPILE, чтобы каждый раз использовался новый план

Используйте подсказки, чтобы сообщить оптимизатору, как себя вести (индекс =, надежный план ... и т. Д.)

Пересмотр процедуры / системы, чтобы обеспечить одинаковые шаблоны доступа независимо от значений параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...