Назад | Перейти на главную страницу

Запрос, выполняемый совершенно иначе через драйвер .NET sql и Sql Management Studio

Наше приложение использует драйвер sql .net, и запросы в профилировщике выглядят примерно так:

sp_executesql N'query where @param = ?, and param2 = ?', param, param2, param3, etc

При копировании и вставке запроса из Profiler в студию управления сервером sql запрос будет выполняться менее чем за минуту по сравнению с 15-20 минутами выполнения из приложения.

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

Чтобы добавить странности, у нас также есть тестовый сервер sql, который по сути является копией рабочего сервера. В нашей тестовой среде с тем же кодом и в основном с теми же данными (несколько дней с момента выпуска) запрос выполняется менее чем за минуту в нашем приложении, а также в студии управления сервером sql. Опять же, профилировщик фиксирует один и тот же план выполнения для всех из них.

Единственное, что я обнаружил, заставляет запрос выполняться правильно - это запуск процедуры sp_updatestats в базе данных, которую мы запускаем каждое утро в 5:00. Что странно, к 7:00 запрос снова будет работать медленно. Если я снова запустил sp_updatestats, запрос завершится менее чем за минуту. И снова все планы выполнения выглядят одинаково.

Я, должно быть, что-то упускаю. Любые идеи?

Включает ли ваш запрос таблицу с восходящим столбцом datetime или datetime2, и одним из параметров является datetime или datetime2, который обычно ищет последнее значение?

Ваши комментарии относительно поведения после обновления статистики говорят о том, что вы столкнулись с проблемой часто устаревшей статистики, которую Гейл Шоу описывает здесь: http://sqlserverpedia.com/blog/sql-server-bloggers/statistics-row-estimations-and-the-ascending-date-column/

Как отмечает Гейл, наиболее простым решением является более частое обновление статистики. В идеале ориентируйтесь на те более частые обновления статистики, которые в них нуждаются - см. Обновить статистику.

В случае очень больших таблиц также может быть полезен отфильтрованный индекс, в зависимости от размера таблицы и шаблонов обновления и чтения.

Сейчас я пытаюсь улучшить свои навыки SQL, так что отнеситесь к этому с недоверием. Но, возможно, это Анализ параметров проблема ?:

Анализ параметров - это процесс, посредством которого SQL Server создает оптимальный план для хранимой процедуры с использованием параметров вызова, которые передаются при первом выполнении хранимой процедуры. Под «первым разом» я на самом деле имею в виду всякий раз, когда SQL Server вынужден скомпилировать или перекомпилировать хранимые процедуры, потому что их нет в кэше процедур. Каждый последующий вызов одной и той же процедуры хранилища с теми же параметрами также будет получать оптимальный план, тогда как вызовы с разными значениями параметров не всегда могут получить оптимальный план.

- http://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing/

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