2010-04-26 5 views

Répondre

2

Généralement, il devra frapper les trois tables. Tenir compte

SELECT A.VAL, B.VAL, C.VAL FROM A JOIN B ON A.ID = B.ID JOIN C ON A.ID = C.ID 

Il est possible qu'un seul ID dans « A » d'avoir zéro, 1 ou plusieurs correspondances dans B ou C. Si la table « C » étaient vides, la vue ne serait jamais renvoyer une ligne, donc même en interrogeant A.VAL ou B.VAL, il faudrait encore voir s'il y avait une ligne correspondante dans "C". L'exception est lorsque, à cause d'une contrainte d'intégrité référentielle forcée, l'optimiseur sait qu'une ligne de 'B' aura toujours une ligne parente dans 'A'. Dans ce cas, un choix de B.VAL n'aurait pas besoin de vérifier l'existence de la ligne parente dans 'A'. Ceci est démontré par ceci article

+0

Merci pour la référence d'article! – Nate

0

Cela dépend probablement du type de joint utilisé. Si elles sont toutes des jointures internes, il faudra certainement examiner les trois tables.

0

En général, le moteur de base de données rejoindrait les trois tables pour s'assurer qu'il recevait la bonne réponse.

Oracle élimine parfois l'une des tables où cela ne change pas le résultat.

Cela peut être fait si: -

  • Il y a une contrainte de clé étrangère à la table à eleminated (soit une ligne dans la table peut être garantie à trouver)

  • La table est autrement inutilisée. c'est-à-dire non sélectionné parmi, dans la clause where, etc.

Questions connexes