Como posso fazer com que o Oracle use índices quando minha visão contém um sindicato tudo?

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

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.

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top