Один из наших клиентов только что перешел на новый сервер.
Для конкретной хранимой процедуры при ее первом запуске требуется более трех минут. Последующие пробеги менее 1 секунды.
Это наводит меня на мысль, что первые три минуты в основном используются для расчета плана выполнения. Последующие запуски затем просто используют кэшированный план и запускаются мгновенно.
В наших тестовых базах данных для расчета плана для той же процедуры требуется около 5 секунд.
Я не вижу ничего ужасного в самом плане - хотя я не представляю его актуальным, так как план показывает, сколько времени требуется для выполнения запроса, а не для его расчета.
Сервер состоит из 16 ядер с 24 ГБ памяти. Не происходит большой загрузки процессора или памяти.
Что может быть причиной таких медленных вычислений только в конкретной базе данных?
Какие шаги я могу предпринять, чтобы найти причину проблемы?
редактировать
Поэтому мне удалось получить доступ к серверу и выполнить запрос с помощью SET SHOWPLAN_XML ON .
Я могу подтвердить, что CompileTime для запроса занимает 99% времени выполнения запроса. StatementOptmEarlyAbortReason является «TimeOut» , на нашей тестовой базе данных с копией базы данных их причина MemoryLimitExceeded.
источник
StatementOptmEarlyAbortReason
?Ответы:
Ненавижу отвечать на свой вопрос, тем более что я очень помог другим найти решение, но здесь все в порядке.
Проблема была из-за некоторой нечеткой статистики в базе данных. Глядя на план выполнения, оптимизатор ожидал 11,5 ТБ данных, возвращенных из запроса. На самом деле это было получение 87kb. Теперь я знаю, что огромные несоответствия между ожидаемыми и реальными возвращаемыми строками являются признаком того, что статистика устарела.
Просто работает
заставляет базу данных обновлять статистику для всех таблиц.
Это уменьшило время выполнения запроса с 3 минут до 6 секунд. Каждый победитель!
Спасибо за всю помощь, ребята. : 0)
источник