JeuWeb - Crée ton jeu par navigateur
Jointures SQL ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Jointures SQL ? (/showthread.php?tid=1695)

Pages : 1 2


RE: Jointures SQL ? - Anthor - 01-04-2008

Ce sera moins rapide avec la condition dans le WHERE, cela fonctionne, mais c'est une hérésie, car c'est le moteur d'optimisation de MySQL qui convertit en INNER JOIN ta requête.

Plus ta requête est complexe plus le serveur aura du mal à l'évaluer, alors pourquoi ne pas l'écrire directement de la bonne manière...

Me souviens de beaucoup d'entretiens d'embauche où les jointures étaient une obligation... Et franchement je vois pas comment non plus m'en passer.


RE: Jointures SQL ? - naholyr - 01-04-2008

Attention, quand on fait une jointure "implicite" (dans la clause WHERE et sans utiliser de clause JOIN) on utilise l'équivalent d'un INNER JOIN (c'est strictement équivalent, aussi bien en terme de résultat que de performance pour peu que la condition sur la clé étrangère soit avant le reste).
L'avantage d'utiliser les jointures explicites, c'est de pouvoir faire des LEFT JOIN. La différence entre les deux c'est qu'un INNER JOIN ne renvoie pas de ligne s'il n'y a pas de relation, alors que le LEFT JOIN renvoie une ligne avec des champs NULL sur la table de droite s'il n'y a pas de relation (RIGHT JOIN en est le symétrique).

Dans le cas d'une relation 1 - 0..1, il est vital d'utiliser des LEFT JOIN, utiliser INNER JOIN (ou la clause WHERE) est une erreur de conception dans ce cas (c'est d'ailleurs un défaut que Propel a bien du mal à corriger, mais j'ai proposé un patch pour Symfony, si ça tente ceux qui s'y intéressent voir le plugin nahoPropelOptimizerPlugin Smile)


RE: Jointures SQL ? - pascal - 02-04-2008

naholyr a écrit :Dans le cas d'une relation 1 - 0..1, il est vital d'utiliser des LEFT JOIN, utiliser INNER JOIN (ou la clause WHERE) est une erreur de conception dans ce cas (c'est d'ailleurs un défaut que Propel a bien du mal à corriger, mais j'ai proposé un patch pour Symfony, si ça tente ceux qui s'y intéressent voir le plugin sfPropelOptimizerPlugin Smile)

c'est donc ça le nahoMachin plug in ? Tongue

symfony, je m'y remets tout doucement, avec plein de projets !

A+

Pascal


RE: Jointures SQL ? - naholyr - 02-04-2008

Exact c'est nahoPropelOptimizer ^^ note que je l'ai pas encore officiellement publié si tu veux jouer avec il faut passer par SVN et lire le README


RE: Jointures SQL ? - maniaco_jazz - 15-04-2008

Citation :Et joindre dans le WHERE c'est le mal en terme de lisiblité, mieux vaut utiliser le mot clé.

Utiliser JOIN et WHERE influe grandement suivant ce que va retourner la requête et ceci en terme de performances.

Une requête dont les jointures sont faites avec WHERE procède comme suit :
- retour du produit cartésien sur toutes les tables sélectionnées
- filtrage avec les conditions du WHERE

Une requête dont les jointures sont faites avec JOIN procède comme suit :
- retour de la jointure
- filtrage avec les conditions éventuelles du WHERE

Si vous avez 2 tables avec 100 enregistrements dans chacune, dans la première solution, le serveur bdd va retourner 10000 enregistrements avant de faire son filtre. Dans la seconde solution, il ne renverra que le résultat de la jointure (100 au maximum donc) et fera le filtrage après.

Donc utilisez le JOIN !

:heuuu:


RE: Jointures SQL ? - Roworll - 15-04-2008

Ca dépends de l'analyseur syntaxique.
Si le moteur SQL n'est pas capable d'interpréter de la même manière la version WHERE et la version JOIN (cad qu'il n'utilisera pas le même plan de requête) il risque effectivement de partir en vrille avec la version WHERE.

A partir de là, on peut remettre en cause la fiabilité de l'analyseur syntaxique du moteur.