Сохранение / кеширование результатов хранимой процедуры для повышения производительности? (SQL Server 2005)

У меня есть SP, который работал над двумя моими людьми сейчас, для выполнения которого все еще требуется 2 минуты или больше. Есть ли способ, чтобы они были предварительно запущены и сохранены в кеше или где-то еще, чтобы, когда моему клиенту нужно было посмотреть эти данные в веб-браузере, он не захотел повеситься ни себе, ни мне?

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

Ответов (5)

Решение

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

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

Хорошо, обо всем по порядку, индексы:

  • Какие индексы у вас есть на таблицах и использует ли их план выполнения?
  • Есть ли у вас индексы по всем полям внешнего ключа?

Во-вторых, использует ли процесс какие-либо из следующих убийц производительности:

  • курсор
  • подзапрос
  • определяемая пользователем функция
  • Выбрать *
  • критерий поиска, который начинается с подстановочного знака

в третьих

  • Можно ли переписать предложение where, чтобы оно было точным ? Есть несколько способов написать почти все, и одни способы работают лучше, чем другие.

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

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

Попробуйте «Анализировать запрос в советнике по настройке ядра базы данных» в меню «Запрос». Обычно я создаю сценарий для процедуры в новом окне, вынимаю часть определения запроса и пробую различные комбинации временных таблиц, обычных таблиц и табличных переменных.

Вы можете кэшировать набор результатов в приложении, а не в базе данных, либо в памяти, сохранив экземпляр объекта данных, либо путем его сериализации на диск. Сколько строк он возвращает? Слишком долго размещать здесь код?

Предпочтительные решения в таком порядке:

  1. Проанализировать запрос и соответствующим образом оптимизировать
  2. Кешируйте его в приложении (вы можете использовать httpRuntime.Cache (даже если это не приложение asp.net)
  3. Кэширование SPROC приводит к созданию таблицы в базе данных, а затем добавляет триггеры, чтобы сделать кеш недействительным (удалить таблицу), поэтому вызов SPROC сначала проверяет, есть ли какие-либо данные в таблице кеша. Если нет, запустите SPROC и сохраните результат в таблице кеша, если да, верните данные из этой таблицы. Триггеры в «исходных» таблицах для SPROC просто удаляют * из CacheTable, чтобы «очистить кеш» (в зависимости от того, что вы делаете sproc, и его зависимостей, вы даже можете частично обновить таблицу кеша на основе триггера , но все это быстро становится трудно поддерживать ... но иногда вам нужно делать то, что вы должны делать ... Такой подход позволит кеш-таблице обновляться по мере необходимости. У вас всегда будут самые свежие данные, а SPROC будет только запускать при необходимости.