Как определить причину хаотичного ухудшения производительности запроса?

Добрый день!

У меня есть Oracle 19.3.0 и PL/SQL процедура, которая содержит SQL запросы и DML инструкции. В некоторые случаи процедура начинает выполняться намного медленнее (в 5-6 раз). Я пытался найти причины этой проблемы и обнаружил, что во время замедления выполняется план с высокой стоимостью. Кажется, что оптимизатор выбирает неправильный план. Я рассмотрел несколько решений, которые временно помогали:

- пересборка статистики для таблиц, используемых в процедуре;
- изменение режима работы оптимизатора (помогало с настройкой 11.2.0.4);
- в самых сложных случаях, когда время выполнения было в 10 раз больше, чем ожидаемое, перезапуск БД (на Linux).

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

P.S. Данная проблема возникает только у одного клиента из 15. У остальных клиентов все работает стабильно и у них точно такой же код.
  • 15 октября 2023 г. 15:58
Ответы на вопрос 2
Для определения причины хаотичного ухудшения производительности запроса вам могут пригодиться следующие шаги:

1. Анализ плана запроса: Проверьте план запроса и определите, существует ли изменение в плане во время замедления выполнения. Просмотрите выполнение запроса до и после замедления, чтобы выявить различия.

2. Пересмотр статистики: Проверьте, есть ли обновленная статистика для таблиц, используемых в запросе. Установите правильные статистические данные для таблиц, индексов и колонок, чтобы оптимизатор выбрал наиболее эффективный план выполнения.

3. Используйте хинты: Рассмотрите возможность использования хинтов, чтобы явно указать оптимизатору, какой план использовать. Но будьте осторожны, потому что использование хинтов может иметь негативное влияние на производительность в долгосрочной перспективе.

4. Анализ изменений в окружении: Проверьте, были ли внесены какие-либо изменения в сети, аппаратное или программное обеспечение, которые могут повлиять на производительность запроса. Например, обновление операционной системы, Oracle или другого программного обеспечения, на котором работает Oracle.

5. Профилирование запроса: Используйте профилирование запроса для определения, какие шаги в запросе занимают наибольшее время выполнения. Найдите узкие места и сосредоточьтесь на их оптимизации.

6. Использование SQL трассировок: Выполните SQL трассировку, чтобы получить подробную информацию о выполнении запроса и о том, какой план выбрал оптимизатор. Это может помочь вам идентифицировать узкое место и при
DML или DDL - это термины из языка SQL, и когда говорят о DML, обычно подразумевают сам язык SQL. Запросы CREATE/ALTER/DROP могут влиять на собираемую статистику, которая в свою очередь влияет на построение плана и скорость выполнения запросов. Также возможно запуск перекомпиляции связанных объектов в фоновом режиме, что занимает ресурсы процессора и замедляет выполнение запросов.
Похожие вопросы