Réponse acceptée !
Salut
La premiere solution est plus claire
à relire pour moi
Le inner join est une jointure ce que l'on veut
alors que le where est un produit cartesien
Les optimiseur ce base sur les inner joins pour faire les jointures
et pas sur les wheres qui eux servent de filtre.
Tu peux voir les différents dans l'analyseur de sqlserveur,
si tu utilises ce logiciel.
Pour info, il y a un petit cours sur l'optimisation ici :
http://sqlpro.developpez.com/cours/optimiser/
http://www.sql-server-performance.com/tuning_joins.asp
Désolé le texte est en anglais pour le dernier.
Mais le texte est clair, il faut mieux utiliser le INNER JOIN
car le where --> CROSS JOIN et il y a besoin d'utiliser la plupart du temps un distinct pour filtrer les données.
Plus précisement
Table A
| ACOL1
| ACOL2
|
|---|
| A1
| AA1
|
| A2
| AA2
|
| A3
| AA3
|
Table B
| BCOL1
| BCOL2
|
|---|
A1
| BB1
|
| A2
| BB2
|
SELECT * FROM A CROSS JOIN B
OU
SELECT * FROM A, B
| ACOL1
| ACOL2
| BCOL1
| BCOL2
|
|---|
| A1
| AA1
| A1
| BB1
|
| A1
| AA1
| A2
| BB2
|
| A2
| AA2
| A1
| BB1
|
| A2
| AA2
| A2
| BB2
|
| A3
| AA3
| A1
| BB1
|
| A3
| AA3
| A2
| BB2 |
Puis apres on applique le WHERE ACOL1 = BCOL1
On a
| ACOL1
| ACOL2
| BCOL1
| BCOL2
|
|---|
| A1
| AA1
| A1
| BB1
|
| A2
| AA2
| A2
| BB2
|
Donc on est passé par un calcul avec 6 lignes pour en obtenir 2
que du gachis.
Peut être que les index et les optimiseurs des SGBD améliore un peu et détecte ce
type de problème.
Mais plus le travail est maché pour eux, mieux c'est.
Bon SQL