Как я могу получить Oracle использовать индексы, когда мой взгляд содержит союз?

StackOverflow https://stackoverflow.com/questions/4267081

Вопрос

View1 это:

SELECT A, B, C FROM view2
UNION ALL
SELECT A, B, C FROM view3
  INNER JOIN TBL5 ON view3.CODE = TBL5.CODE

Столбец C индексируется в исходных таблицах, и когда я выполняю либо из выбора операторов по отдельности, он использует индекс и возвращается во вспышке. Когда я использую представление об этом раз. Я находился под впечатлением, что Oracle переписал запросы против взглядов и использовали индексы, где полезны, а не делать SELECT * FROM VIEW1 А затем применяя предикаты после факта.

Что я делаю неправильно? Взгляды образец выше освещают проблему, но мои реальные взгляды каждый вступил в десятки таблиц, чтобы представление действительно необходимо.

Это было полезно?

Решение

Оптимизатор не знает, что будет ранее значение кода, когда он создает план выполнения, потому что вы идете против представления. Если вы находитесь в 11G, вы можете использовать подсказку оптимизатора Push_Pred, чтобы сделать его работать, как вы ожидаете.

Другие советы

Вы можете попробовать подсказку. Или убедитесь, что таблицы анализируются.

Еще одна мысль - может быть, сделайте метериальный вид?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top