Как я могу предотвратить преобразование UNPIVOT в UNION ALL?

13

У меня есть несколько сложный запрос Oracle, который занимает около получаса. Если я возьму медленную часть запроса и выполню его отдельно, он завершится через несколько секунд. Вот скриншот отчета SQL Monitor для изолированного запроса:

хорошо, план

Вот та же логика при запуске как часть полного запроса:

плохой план

Цвета соответствуют одинаковым таблицам на обоих скриншотах. Для медленного запроса Oracle делает MERGE JOINмежду двумя таблицами, которые не имеют условия равенства в JOIN. В результате этого около 150 миллионов промежуточных строк обрабатываются без необходимости.

Я могу обойти эту проблему с помощью подсказок или переписываний запросов, но я хочу понять как можно больше основных причин, чтобы избежать этой проблемы в будущем и, возможно, отправить отчет об ошибках в Oracle. Каждый раз, когда я получаю плохой план, UNPIVOTтекст запроса превращается UNION ALLв план. Для дальнейшего изучения я бы хотел предотвратить преобразование запроса. Мне не удалось найти название для этого преобразования. Я также не смог найти подсказку запроса или параметр подчеркивания, который будет препятствовать этому. Я тестирую на сервере разработки, так что все идет.

Есть что - нибудь , что я могу сделать , чтобы предотвратить преобразование запроса из UNPIVOTв UNION ALL? Я на Oracle 12.1.0.2.

Я не могу поделиться запросом, именами таблиц или данными по причинам IP. Я не смог придумать простое воспроизведение. С учетом сказанного мне непонятно, зачем эта информация нужна для ответа на вопрос. Вот пример запроса UNPIVOT вместе с тем же запросом, реализованным как UNION ALL.

Джо Оббиш
источник
1
В вашем примере объединение все существует, следовательно, оно показывает. Я выполнил свой собственный запрос, в котором нет объединения all, и план объяснения не показывает union all. Итак, возможно, именно ваш запрос, а не операция отмены, вызывает проблему здесь?
Радж
@Raj Смысл в том, чтобы отключить это преобразование без изменения текста запроса, чтобы еще больше сузить проблему.
Джо Оббиш
3
Я работал с Oracle в течение многих лет, но иногда мне нужно увидеть запрос или хотя бы совместимый псевдопросмотр с заменой ваших столбцов / таблиц. без которого я могу продолжать догадываться, но это не полезно ни вам, ни мне.
Радж

Ответы:

1

Попробуйте следующую подсказку оптимизатора Oracle:

NO_EXPAND

Этот совет отключает OR-расширение. Расширение OR преобразует объединенные условия OR или IN-списки в whereпредложении в составной запрос с union all.

У нас нет вашего SQL, так что это предположение, но оно кажется приемлемым вариантом.

В качестве второго варианта, поскольку вы находитесь в среде разработки, вы можете попробовать подсказку оптимизатора Oracle:

NO_QUERY_TRANSFORMATION

но этот совет отключает все преобразования запросов, которые оптимизатор может выполнять, кроме преобразований, которые всегда может применять оптимизатор .

tale852150
источник
ИЛИ это не то же самое, что UNPIVOT. Можете ли вы привести простой пример, показывающий подсказку NO_EXPAND для UNPIVOT? Я попробовал это, и это не сработало для меня.
Джо Оббиш
@JoeObbish - Можете ли вы предоставить уменьшенную версию вашего сложного SQL вместе с UNPiVOT, пожалуйста? Я хотел бы помочь вам, если смогу ...
tale852150
1
@JoeObbish - обновленный ответ с другим предложением. Надеюсь это поможет.
tale852150