2010-09-07 8 views
2

D'un point de vue de la performance est-il même faire ceci:Joins contre vues: problèmes de performances

select * from MYTABLEONE MT1 
join MYVIEW MV on MT1.ID = MV.ID 

( où la vue est

create view MYVIEW as 
select MT2.*, MT3.* 
from MYTABLETWO MT2 
join MYTABLETHREE MT3 on MT2.OtherID = MT3.OtherID 

)

Ou est-ce préférable de le faire:

select MT1.*, MT2.*, MT3.* 
from MYTABLEONE MT1 
join MYTABLETWO MT2 on MT1.ID = MT2.ID 
join MYTABLETHREE MT3 on MT2.OtherID = MT3.OtherID 

Répondre

3
pas

En supposant vue indexée ...

La vue sera comme une macro élargi et devrait générer le même plan.

La vue n'ajoute aucune valeur sauf si elle est réutilisée. Cependant, vous pouvez vous retrouver avec une vue jointive pour voir la jonction qui, lorsqu'elle est développée, donne un plan beaucoup plus complexe que prévu.

À mon humble avis, n'utilisez pas de vue sauf si vous savez ce que vous faites.

0

À moins que MYVIEW ne soit une vue indexée, il n'y a pas de perte ou de gain en termes de performances. En outre, il est facile de comparer deux sélections en examinant le «coût estimé du sous-arbre» ​​dans le plan d'exécution réel.

0

Cela devrait être pareil. S'il vous plaît, tout le monde, commencez à faire confiance aux SGBD pour qu'ils soient plus intelligents qu'ils ne l'étaient il y a 25 ans.

3

On peut espérer qu'il n'y a pas de différence dans ce cas simple. Lorsque vous travaillez avec des vues imbriquées et des vues jointes sur des vues, il est toujours utile de vérifier les plans d'exécution pour le confirmer.

Voici one example d'un cas où les plans des vues jointes ne sont pas optimaux.

Il peut aussi y avoir des problèmes avec predicate pushing Vues

Questions connexes