Понимание Oracle Optimization и объяснения плана с советами - PullRequest
0 голосов
/ 27 сентября 2018

Мои коллеги и я успешно использовали недокументированную подсказку Oracle / * + MATERIALIZE * / для хранения данных в глобальных временных таблицах, чтобы некоторые запросы выполнялись быстрее из-за того, что мы можем использовать эту подсказку для извлечения данных один разпоскольку на некоторые из этих данных ссылаются несколько раз в одном и том же запросе.

Мы не смогли выяснить, почему это не всегда работает.Я не могу создать ту же проблему, используя поддельные данные, однако мы часто сталкиваемся с этой проблемой при разработке нашей производственной базы данных OLTP при извлечении данных из нескольких таблиц в больших запросах.

Проблема

У меня есть запрос, который использует несколько CTE, и стоимость в плане объяснения действительно довольно хорошая.Проблема возникает, когда я начинаю использовать данные в последующих CTE.Я ссылаюсь на некоторые из этих данных несколько раз в этих последующих CTE и, следовательно, чтобы ускорить мой запрос, как я делал другие, я добавляю подсказку / * + MATERIALIZE * /.Опять же, это часто работает, однако бывают случаи, когда это не удается, и я просто не могу понять, почему.

Пример НЕ используется HINT

enter image description here

Пример использования HINT

enter image description here

Опять же, этот метод очень хорошо работал длядругие запросы.Как я понимаю ... как только данные возвращаются запросом, который имеет / / + MATERIALIZE * / намек на то, что данные хранятся и могут быть использованы без дальнейшего доступа к таблицам, создавшим этот набор данных.Моя проблема здесь в том, что, как только я пытаюсь сохранить эти данные в своем собственном прекрасном временном табле, оракул решает, что это невыполнимая задача.

...