Comment puis-je obtenir Oracle à des indices d'utilisation lorsque mon avis contient une UNION ALL?
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.
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