Сохранение / кеширование результатов хранимой процедуры для повышения производительности? (SQL Server 2005)
У меня есть SP, который работал над двумя моими людьми сейчас, для выполнения которого все еще требуется 2 минуты или больше. Есть ли способ, чтобы они были предварительно запущены и сохранены в кеше или где-то еще, чтобы, когда моему клиенту нужно было посмотреть эти данные в веб-браузере, он не захотел повеситься ни себе, ни мне?
Я далеко не администратор базы данных, так что я в некоторой степени во власти тех, кого нанимаю, чтобы разобраться в этом для меня, так что наличие некоторых предварительных знаний действительно могло бы мне помочь.
Ответов (5)5
Если для запуска действительно требуется столько времени, вы можете запланировать запуск процесса с помощью агента SQL и передать вывод в таблицу, а затем изменить веб-приложение для чтения таблицы, а не для выполнения хранимой процедуры. Вам нужно будет решить, как часто запускать обновление, и обрабатывать запросы, которые возникают во время его обновления, но с этим также можно справиться, имея два выходных файла, один в реальном времени и один для последнего обновления.
Но я бы еще раз взглянул на процедуру, посмотрел на план выполнения и посмотрел, где он медленный, убедитесь, что он не выполняет полное сканирование таблицы.
Хорошо, обо всем по порядку, индексы:
- Какие индексы у вас есть на таблицах и использует ли их план выполнения?
- Есть ли у вас индексы по всем полям внешнего ключа?
Во-вторых, использует ли процесс какие-либо из следующих убийц производительности:
- курсор
- подзапрос
- определяемая пользователем функция
- Выбрать *
- критерий поиска, который начинается с подстановочного знака
в третьих
- Можно ли переписать предложение where, чтобы оно было точным ? Есть несколько способов написать почти все, и одни способы работают лучше, чем другие.
Я предлагаю вам купить вашим разработчикам книги по настройке производительности.
Вероятно, ваша процедура может быть исправлена, но, не видя кода, трудно предположить, в чем могут быть проблемы.
Предпочтительные решения в таком порядке:
- Проанализировать запрос и соответствующим образом оптимизировать
- Кешируйте его в приложении (вы можете использовать httpRuntime.Cache (даже если это не приложение asp.net)
- Кэширование SPROC приводит к созданию таблицы в базе данных, а затем добавляет триггеры, чтобы сделать кеш недействительным (удалить таблицу), поэтому вызов SPROC сначала проверяет, есть ли какие-либо данные в таблице кеша. Если нет, запустите SPROC и сохраните результат в таблице кеша, если да, верните данные из этой таблицы. Триггеры в «исходных» таблицах для SPROC просто удаляют * из CacheTable, чтобы «очистить кеш» (в зависимости от того, что вы делаете sproc, и его зависимостей, вы даже можете частично обновить таблицу кеша на основе триггера , но все это быстро становится трудно поддерживать ... но иногда вам нужно делать то, что вы должны делать ... Такой подход позволит кеш-таблице обновляться по мере необходимости. У вас всегда будут самые свежие данные, а SPROC будет только запускать при необходимости.