Я пытаюсь понять проблему, которая возникает у нас с SQL Server 2000. Мы являемся веб-сайтом с умеренными транзакциями, и у нас есть хранимый процесс, sp_GetCurrentTransactions
который принимает идентификатор клиента и две даты.
Теперь, в зависимости от даты и клиента, этот запрос может возвращать от нуля до 1000 строк.
Проблема: мы столкнулись с тем, что внезапно мы получим ряд ошибок (обычно Execution Timeout Expired
или аналогичных) для конкретного клиента, пока они пытаются выполнить этот сохраненный процесс. Итак, мы изучаем запрос, запускаем его в SSMS и обнаруживаем, что он занимает 30 секунд. Таким образом, мы перекомпилируем хранимый процесс и -bang- теперь он работает за 300 мс.
Я говорил с нашим администратором базы данных об этом. Он сказал мне, что база данных создала план запроса, когда мы создали хранимый процесс. Он сказал, что это хороший план для этого набора параметров, но если вы добавите в него определенный набор параметров, тогда этот план не будет лучшим планом для этих данных, и поэтому вы увидите, что он работает медленно.
Варианты, представленные мне, - это перемещение этого проблемного запроса из хранимого процесса и обратно в динамический SQL, в котором план выполнения создается при каждом запуске.
Это похоже на шаг назад ко мне, и я чувствую, что должен быть способ обойти это. Есть ли другой способ решить эту проблему?
Любые ответы приветствуются.