Como posso fazer com que o Oracle use índices quando minha visão contém um sindicato tudo?
Pergunta
View1 é:
SELECT A, B, C FROM view2
UNION ALL
SELECT A, B, C FROM view3
INNER JOIN TBL5 ON view3.CODE = TBL5.CODE
A coluna C é indexada nas tabelas de origem e, quando executo uma das instruções de seleção individualmente, ele usa o índice e volta em um flash. Quando eu uso a visualização, ele se destaca. Eu estava com a impressão de que o Oracle reescreveu consultas contra visões e usava índices quando útil, em vez de fazer um SELECT * FROM VIEW1
e depois aplicar os predicados após o fato.
O que estou fazendo errado? As visualizações de amostra acima iluminam o problema, mas minhas opiniões reais se juntam a dezenas de tabelas para que uma visão seja realmente necessária.
Solução
O otimizador não sabe qual o valor do código estará antes do tempo quando criar o plano de execução porque você está indo contra a visão. Se você estiver em 11g, pode usar a dica do otimizador push_pred para fazê -lo funcionar como você espera.
Outras dicas
Você pode tentar uma dica. Ou verifique se as tabelas estão analisadas.
Um outro pensamento - talvez faça uma visão meseializada?