Как я могу заставить Oracle использовать индексы, когда мое представление содержит UNION ALL? - PullRequest
2 голосов
/ 24 ноября 2010

VIEW1 IS:

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, а затем применять предикаты после факта.

Что я делаю не так? Приведенные выше примеры представлений освещают проблему, но мои реальные представления объединяют десятки таблиц, поэтому представление действительно необходимо.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Оптимизатор не знает, какое значение CODE будет опережать время при построении плана выполнения, потому что вы идете против представления.Если вы в 11g, вы можете использовать подсказку оптимизатора PUSH_PRED, чтобы она работала так, как вы ожидаете.

0 голосов
/ 24 ноября 2010

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

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

...