Comment puis-je obtenir Oracle à des indices d'utilisation lorsque mon avis contient une UNION ALL?

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

Question

View1 EST:

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

La colonne C est indexé dans les tables source, et quand j'exécute une ou l'autre des instructions select individuellement, il utilise l'index et revient en un éclair. Lorsque j'utilise la vue, il arrive à expiration. J'avais l'impression que les requêtes Oracle Réécriture sur des vues et des index utilisés lorsque cela est utile plutôt que de faire un SELECT * FROM VIEW1, puis en appliquant les prédicats après le fait.

Qu'est-ce que je fais mal? Les vues de l'échantillon ci-dessus Illuminate La question, mais mes vues réelles chacun se joindre à des dizaines de tables si une vue est vraiment nécessaire.

Était-ce utile?

La solution

L'optimiseur ne sait pas ce que la valeur du CODE sera à l'avance quand il construit le plan d'exécution parce que vous allez à l'encontre de la vue. Si vous êtes à 11g, vous pouvez utiliser optimiseur le soupçon PUSH_PRED pour le faire fonctionner comme prévu.

Autres conseils

vous pouvez essayer un Hint. ou assurez-vous que les tables sont analysées.

une autre pensée - peut-être faire un Meterialized Voir

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top