2014-09-08 1 views
0

J'ai une vue qui renvoie une liste de projets pour les clients et pour les fournisseurs. Fondamentalement, j'utilise cette vue pour aller chercher la liste des projets pour un client ou un fournisseur, jamais les deux en même temps. Ainsi, la vue est interrogé soit comme:Requête de branchement SQL avec union tout - performance

ou

SELECT * FROM projects_list 
WHERE vendor_id = 'A_VENDOR'; 

Alors basiquement je voudrais exécuter soit la première partie de l'union s'il n'y a pas de jeu de vendor_id ou deuxième partie - si Vendor_id est défini. Le problème est que lorsque j'accède à la vue en tant que client, Oracle passe beaucoup de temps à vérifier le "fournisseur Branck" quand il n'est pas nécessaire, et la requête est lente. Je peux maintenant scinder cette vue en deux et choisir une vue différente à chaque fois. Mais en réalité, j'ai beaucoup de points de vue sur celui-ci et je n'accède pas directement à celui-ci. Je devrais dupliquer chacune des vues "enfant" et faire de nombreux changements dans le code de l'application pour effectuer cette modification.

Y a-t-il un moyen de "faire allusion" à l'oracle pour ignorer la première ou la deuxième branche de l'union?

+0

Vous souhaitez peut-être envisager de nommer explicitement vos colonnes de sélection. Une fois que vous avez fait cela, essayez d'ajouter une colonne de constante supplémentaire à chacune de vos unions, c'est-à-dire 'V' et 'C', puis sélectionnez explicitement cela - cela vous aide-t-il? –

+0

Il semble que oui, merci – SWilk

+0

Je vais coller comme une réponse –

Répondre

0

Vous pouvez envisager de nommer explicitement vos colonnes sélectionnées. Une fois que vous avez fait cela, essayez d'ajouter une colonne de constante supplémentaire à chacune de vos unions, c'est-à-dire 'V' et 'C', puis sélectionnez explicitement cela - cela vous aide-t-il?

à savoir

CREATE OR REPLACE VIEW projects_list AS 
SELECT pr.*, 'C' Type 
     c.customer_name as party_name, 
     null as vendor_id, 
     null as vendor_data 
    FROM projects pr 
    JOIN customers c on (pr.customer_id = c.customer_id) 
UNION ALL 
SELECT pr.*, 'V' 
     v.vendor_name as party_name, 
     v.vendor_id, 
     v.some_column as vendor_data 
    FROM projects pr 
    JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
    JOIN vendors v on (pov.vendor_id = v.vendor_id) 

Ensuite, utilisez

SELECT * FROM projects_list WHERE Type = 'V'...