Почему запрос к базе данных только медленный в приложении? - PullRequest
3 голосов
/ 30 сентября 2010

У меня есть веб-страница, для выполнения одного запроса к базе данных требуется 10 минут, но этот же запрос возвращается менее чем за секунду при запуске из SQL Server Management Studio.

Веб-страница просто запускает SQL набаза данных, которая выполняет хранимую процедуру, которая, в свою очередь, выполняет довольно простой выбор из четырех таблиц.Опять же, код является базовым ADO, устанавливая CommandText для SqlCommand, а затем выполняя ExecuteReader для получения данных.

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

Я смотрел на этот вопрос но это не применимо, так как веб-страница буквально просто запускает текст в базе данных.

У кого-нибудь есть хорошие идеи, почему это идет медленно, а не другим?Спасибо

Ответы [ 2 ]

4 голосов
/ 30 сентября 2010

Я подозреваю, что сниффинг параметров.

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

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

Use YourDatabase;

SELECT *
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where sys.dm_exec_sql_text.OBJECTID=object_id('YourProcName') 
         and attribute='set_options'
1 голос
/ 30 сентября 2010

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

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

...