Почему запрос медленный, но процедура выполняется на SQL Server? - PullRequest
4 голосов
/ 23 февраля 2009

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

Я использую один и тот же запрос в обоих случаях, и не имеет значения, звоню ли я из Management Studio или SqlCommand из кода.

РЕДАКТИРОВАТЬ: план выполнения выглядит иначе. Итак, почему? Я называю это ТОЧНО одинаковым набором параметров.

РЕДАКТИРОВАТЬ: после дополнительного тестирования кажется, что замедление в 10 раз происходит только при запуске параметризованного запроса из SQL Management Studio.

Ответы [ 6 ]

10 голосов
/ 23 февраля 2009

Одна вещь, которую я недавно видел, это то, что если вы неправильно настроите параметры запроса, это может вызвать серьезные проблемы.

Например, допустим, у вас есть параметр для индексированного столбца varchar, и вы установите его из .Net с помощью метода AddWithValue() SqlCommand. Вы находитесь в мире боли с этим сценарием. .Net использует Unicode-строки и устанавливает ваш параметр как nvarchar, а не varchar. Теперь сервер sql не сможет использовать ваш индекс, и вы увидите значительное снижение производительности.

4 голосов
/ 23 февраля 2009

Узнайте, используют ли они один и тот же план выполнения, чтобы отобразить его при запуске. Используйте «включить фактический план выполнения» в студии управления и посмотрите, в чем разница.

3 голосов
/ 23 февраля 2009

Настройки уровня соединения могут быть критическими в некоторых случаях, особенно ANSI NULLS, CONCAT NULL YIELDS NULL и т. Д. В частности, если у вас есть вычисленные постоянные индексированные столбцы (включая повышенные столбцы "xml") тогда он не будет доверять предварительно рассчитанному значению индекса, если настройки несовместимы, и будет пересчитывать для каждой строки (т. е. сканирование таблицы вместо поиска по индексу).

2 голосов
/ 23 февраля 2009

Параметризованные запросы имеют множество преимуществ , в том числе зачастую значительное увеличение производительности.

  • Кэширование запросов
  • Проблемы конкатенации строк сведены к минимуму
  • адресация SQL-инъекции
  • Данные не нужно преобразовывать в строку перед обработкой
1 голос
/ 23 февраля 2009

Обнаружение параметров может влиять на производительность хранимой процедуры.

http://omnibuzz -sql.blogspot.com / 2006/11 / параметр обнюхивать сохраненную-procedures.html

0 голосов
/ 23 февраля 2009

Хранимые процедуры могут выполняться быстрее, поскольку план выполнения кэшируется сервером sql.

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

DBCC FREEPROCCACHE
DBCC FLUSHPROCINDB (<dbid>)

Вы запускаете их непосредственно на сервере SQL, чтобы исключить какие-либо сетевые операции ввода-вывода из тестирования производительности?

Я предполагаю, что в первый раз он работает медленно, затем, когда он кэшируется, он работает быстрее.

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