2010-11-24 15 views
2

View1 EST:Comment puis-je utiliser Oracle pour utiliser des index lorsque ma vue contient UNION ALL?

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

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, elle expire. J'avais l'impression qu'Oracle réécrivait les requêtes sur les vues et utilisait les index là où c'était utile plutôt que de faire un SELECT * FROM VIEW1 puis d'appliquer les prédicats après le fait.

Qu'est-ce que je fais mal? Les exemples de vues ci-dessus éclairent le problème, mais mes vues réelles rejoignent des douzaines de tables pour qu'une vue soit vraiment nécessaire.

+0

La colonne "CODE" est-elle la colonne indexée? Vous dites "Colonne C". P.S. http://asktom.oracle.com/pls/asktom/f?p=100:11:0::NO::P11_QUESTION_ID:625452100346586215 – Tim

+0

@Tim: Oui, il existe aussi un index sur CODE. view2, view3 et la deuxième partie de ce UNION ALL sont tous optimisés et fonctionnent bien avec mes requêtes, mais quand je interroge cette vue elle-même les choses tombent en panne. –

+1

Je pense que nous aurions besoin de voir les plans d'exécution pour cette requête, et pour les deux parties exécutées séparément, afin de fournir des conseils vraiment utiles. –

Répondre

2

L'optimiseur ne sait pas quelle sera la valeur de CODE à l'avance lors de la génération du plan d'exécution car vous allez à l'encontre de la vue. Si vous êtes en 11g, vous pouvez utiliser l'indicateur d'optimiseur PUSH_PRED pour le faire fonctionner comme prévu.

0

vous pouvez essayer un ASTUCE. ou assurez-vous que les tables sont analysées. Une autre pensée - peut-être faire une vue Meterialized?