INNER JOIN imbriqué vs INNER JOIN vs O WH: exactitude, performance, clarté pour un cas particulier (pas un problème typique JOIN / WHERE)
Je suis étudiant jointures internes et Im un vieux OÙ SQL-92 de l'homme. Je voudrais savoir les implications et de comprendre comment cela fonctionne. Donc, c'est juste une question théorique sur les jointures SQL.
Est-ce...
SELECT * FROM -- Query 1
tbl1
INNER JOIN (
tbl2
INNER JOIN (
tbl3 INNER JOIN tbl4 ON tbl3.Col1 = tbl4.Col1
)
ON tbl2.col1 = tbl3.col2
)
ON tbl1.col1 = tbl3.col3
...le même que celui de la?
SELECT * FROM -- Query 2
tbl3
INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
...ou ce (non triées par résolution logique)?
SELECT * FROM -- Query 3
tbl3
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
INNER JOIN tbl4 ON tbl3.col1 = tbl4.col1
..ou ce (nœud de référence changé; voyez, il y a une table référencée avant il est cité, mais le produit Cartésien doit être le même)
SELECT * FROM -- Query 4
tbl4
INNER JOIN tbl1 ON tbl1.col1 = tbl3.col3
INNER JOIN tbl2 ON tbl2.col1 = tbl3.col2
INNER JOIN tbl3 ON tbl4.col1 = tbl3.col1
... ou est-ce?
SELECT * FROM -- Query 5
tbl1,tbl2,tbl3,tbl4
WHERE
tbl3.col1 = tbl4.col1
tbl2.col1 = tbl3.col2
tbl1.col1 = tbl3.col3
...de l'esthétique, syntaxique, les meilleures pratiques et fonctionnelles des points de vue?
Ses une question très ouverte, mais je trouve assez intéressant pour la communauté de jeter un peu de lumière!
source d'informationauteur Whimusical
Vous devez vous connecter pour publier un commentaire.
Tous les moteurs de base de données, j'ai été en étroite collaboration avec le (c'est
SQL Server
Oracle
PostgreSQL
MySQL
Sybase
SQLite
Informix
etFirebird
) permettra d'optimiser dans le même plan.La quatrième question, toutefois, de ne pas analyser sur tous les moteurs (vous ne pouvez pas faire référence à un tableau dans un
ON
clause avant il avait été utilisé dans unJOIN
clause)MySQL
offreSTRAIGHT_JOIN
clause qui affecte l'ordre de jointure utilisé dans le plan.Dans
Oracle
il ya un soupçon/*+ ORDERED */
et dansSQL Server
similaire il ya un soupçonFORCE ORDER
. Si une requête utilise ces indicateurs, le plan de commande sera affectée par l'ordre de jointure.À partir d'un point de vue de l'exactitude qu'ils sont susceptibles d'égalité. À partir d'un point de vue des performances, il dépend du SGBD (je ne peux parler que pour SQL Server, où toutes les variantes donnera le même plan d'exécution).
Dans Sybase, ils auront le même plan d'exécution ainsi!
L'optimiseur de requête est assez intelligent pour construire le même plan d'exécution pour tous 🙂
Il pourrait changer de l'intérieur, la requête pour sélectionner d'abord la plus petite table et faire les jointures internes avec celui.
Regardind à l'aide de la jointure interne ou la jointure imbriquée (le dernier), je préfère la première. C'est plus lisible d'avoir les jointures internes avec les connexions entre les tables et ensuite, si nécessaire, une clause where avec les restrictions (dans votre exemple, vous n'avez pas ces restrictions).