У меня есть несколько сложный запрос Oracle, который занимает около получаса. Если я возьму медленную часть запроса и выполню его отдельно, он завершится через несколько секунд. Вот скриншот отчета SQL Monitor для изолированного запроса:
Вот та же логика при запуске как часть полного запроса:
Цвета соответствуют одинаковым таблицам на обоих скриншотах. Для медленного запроса Oracle делает MERGE JOIN
между двумя таблицами, которые не имеют условия равенства в JOIN
. В результате этого около 150 миллионов промежуточных строк обрабатываются без необходимости.
Я могу обойти эту проблему с помощью подсказок или переписываний запросов, но я хочу понять как можно больше основных причин, чтобы избежать этой проблемы в будущем и, возможно, отправить отчет об ошибках в Oracle. Каждый раз, когда я получаю плохой план, UNPIVOT
текст запроса превращается UNION ALL
в план. Для дальнейшего изучения я бы хотел предотвратить преобразование запроса. Мне не удалось найти название для этого преобразования. Я также не смог найти подсказку запроса или параметр подчеркивания, который будет препятствовать этому. Я тестирую на сервере разработки, так что все идет.
Есть что - нибудь , что я могу сделать , чтобы предотвратить преобразование запроса из UNPIVOT
в UNION ALL
? Я на Oracle 12.1.0.2.
Я не могу поделиться запросом, именами таблиц или данными по причинам IP. Я не смог придумать простое воспроизведение. С учетом сказанного мне непонятно, зачем эта информация нужна для ответа на вопрос. Вот пример запроса UNPIVOT вместе с тем же запросом, реализованным как UNION ALL.
источник
Ответы:
Попробуйте следующую подсказку оптимизатора Oracle:
Этот совет отключает OR-расширение. Расширение OR преобразует объединенные условия OR или IN-списки в
where
предложении в составной запрос сunion all
.У нас нет вашего SQL, так что это предположение, но оно кажется приемлемым вариантом.
В качестве второго варианта, поскольку вы находитесь в среде разработки, вы можете попробовать подсказку оптимизатора Oracle:
но этот совет отключает все преобразования запросов, которые оптимизатор может выполнять, кроме преобразований, которые всегда может применять оптимизатор .
источник