Как создать индекс для временной таблицы с учетом подзапроса? - PullRequest
2 голосов
/ 26 февраля 2010

У меня есть запрос с оператором WITH для подзапроса вверху, а затем я запускаю пару CONNECT BY для подзапроса. Подзапрос может содержать десятки тысяч строк, и глубина иерархии CONNECT BY не ограничена. В настоящее время этот запрос занимает более 30 секунд; Можно ли указать индексы для размещения во временной таблице, созданной для факторизованного подзапроса, чтобы ускорить CONNECT BY, или ускорить его другим способом?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

Возможно, вы сможете использовать подсказку MATERIALIZE с подфакторингом запроса, чтобы подзапрос не повторялся повторно. Пока он недокументирован, он, похоже, надежно сбрасывает результаты предложения WITH во временную таблицу.

В блоге Джонатана Льюиса есть несколько примеров того, как его можно использовать. Однако существует некоторый риск из-за недокументированного характера подсказки.

2 голосов
/ 26 февраля 2010

Нет способа сделать это правильно в запросе: Oracle не поддерживает Eager Spool.

Вы можете временно сохранить свой набор результатов в индексированной временной таблице и выполнить запрос CONNECT BY к нему.

Однако для невыразимых условий равенства в запросе CONNECT BY обычно создает хеш-таблицу, которая в большинстве случаев даже лучше индекса.

Не могли бы вы опубликовать свой запрос здесь?

...