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

ПРОСМОТР1 ЭТО:

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

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

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


person aw crud    schedule 24.11.2010    source источник
comment
Является ли столбец CODE индексированным столбцом? Вы говорите Column C. P.S. asktom.oracle.com/ пожалуйста/спросите/   -  person Tim    schedule 24.11.2010
comment
@Tim: Да, есть указатель CODE. view2, view3 и вторая часть этого UNION ALL оптимизированы и хорошо работают с моими запросами, но когда я запрашиваю само это представление, все ломается.   -  person aw crud    schedule 24.11.2010
comment
Я думаю, нам нужно увидеть планы выполнения для этого запроса и для двух частей, выполняемых отдельно, чтобы дать какой-либо действительно полезный совет.   -  person Dave Costa    schedule 24.11.2010


Ответы (2)


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

person erbsock    schedule 24.11.2010

Вы можете попробовать СОВЕТ. или убедитесь, что таблицы проанализированы.

еще одна мысль - может быть, сделать Meterialized View?

person Randy    schedule 24.11.2010