Хаотичное ухудшение производительности запроса — как определить причину?
Добрый день.
БД Oracle 19.3.0
Есть pl/sql процедура, содержащая в себе sql запросы, а так же dml инструкции.
В совершенно рандомное, не привязанное ни к чему время данная процедура начинает выполняться медленнее (в 5-6 раз). Пытался определить причины - в какой-то момент нашел, что в момент тупняков выполняется план с высокой стоимостью, как будто оптимизатор выбирает некорректно план. Что помогало (в разное время помогало что-то одно):
-пересобрать статистику по таблицам, к которым выполняется обращение в процедуре
-поменять режим работы оптимизатора (ставил 11.2.0.4 - периодически помогало, сейчас он и стоит)
-в самые трудные случаи, где время выполнения было уже в 10 раз больше чем ожидаемое - перезапуск бд (установлено все на linux)
Я потерял сон и аппетит, уже не знаю куда и как копать чтобы понять, в чем проблема.
Если есть какие-то рекомендации - буду очень признателен.
P.S. проблема обнаруживается пока что у одного клиента из 15. У остальных точно такой же код, и там все работает стабильно.
У Оракла есть пути стабилизации планов. Если ты точно знаешь что текущий план подходит то его можно
зафиксировать для данного SQL_ID. Последний раз я этим занимался в Oracle 11g и как сейчас - не знаю
но наверное этот API сохранился.
dml или ddl? обычно когда имеют в виду dml то говорят просто sql.
запросы create/alter/drop могут менять или сбрасывать собираемую статистику, которая в свою очередь влияет на построение плана и итоговую скорость выполнения запросов
Так же возможно каскадный запуск перекомпиляции связанных объектов в фоне (если я верно понимаю как это работает в oracle) что банально отнимает процессорное время и соответственно замедляет выполнение запросов
ну тогда банальные вопросы:
- что в системе в этот момент происходит?
- железо случайно не десктопное, а то какой-нибудь дешевый ssd после записи несколько секунд деградирует скорость чтения на порядок.