Внезапное падение производительности в веб-приложении ASP.NET; Нужен индекс БД? - PullRequest
2 голосов
/ 08 марта 2012

У меня есть веб-приложение ASP.NET 2.0, подкрепленное довольно сложной базой данных SQL Server (множество таблиц и множество объединений происходят в большом количестве запросов).Мои журналы показывают, что однажды время загрузки на стороне сервера для одного конкретного типа страниц значительно возросло.Обычно она была ниже 100 мс, а иногда - около 200 мс до того, и она превышала 600 мс и была там с тех пор (чуть более недели назад).В прошлый раз, когда мы переносили новый код в производство, прошло почти две недели, прежде чем это произошло, и в эту дату в систему не было помещено большого объема новых данных.

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

Я сузил его до одного вызова базы данных (одна строка C #), который занимал около 200 мсвызвать хранимую процедуру и собрать результаты в объекты .NET (подавляющее большинство этого времени находится в БД).Я поднял этот sproc, скопировал его тело и заставил SQL Server Manager сообщить мне примерный план выполнения.Он сказал мне, что отсутствовал некластеризованный индекс, который я создал;это привело к тому, что время обращения к базе данных стало меньше 100 мс.Еще одно исследование показало, что у этого типа страницы нет другого существенного снижения производительности.

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

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

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

РЕДАКТИРОВАТЬ: я добавил индекс в производство, и это снизило время загрузки страницы примерно до 100 мс.Я все еще не совсем понимаю, что случилось;может быть, когда-нибудь я узнаю что-то не связанное с базами данных и SQL.

1 Ответ

1 голос
/ 08 марта 2012

Производительность плана выполнения в MSSQL сложно предсказать.Возможно, отсутствующий индекс увеличит время выполнения на квадрат размера таблицы.Это бы выглядело так, как будто оно работает, работает, работает, а затем внезапно становится мучительно медленным.

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

Тем не менее, 100 мсек для SP, выполняемого страницей ASP, довольно долго.Если страница используется часто, попробуйте оптимизировать sp.

...