Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1680 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Difference entre 2 commandes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Difference entre 2 commandes

n°1928947
Profil sup​primé
Posté le 05-10-2009 à 12:19:27  answer
 

Bonjour,
je debute un peu en SQL et je me pose une question sur la difference entre c'est 2 commandes.
 
Supposons que j'ai une table "comments" qui contient les champs : id, name, user_id
et une table "users" qui contient : id, name, grade
 
SELECT "comments".*  
FROM "comments" INNER JOIN "users" ON "users".id = "comments".user_id
WHERE "users".grade = 'admin'
 
SELECT "comments".*  
FROM "comments"
WHERE "comments".user_id IN (SELECT id
                                          FROM users
                                          WHERE "users".grade = 'admin');
 
En fait, je me demande si le fait de faire une jointure ne charge pas inutilement des champs (dans le cas ou la table "users" contiendrais d'autre champs) mais je me demande aussi si le fait de faire une requete imbriqué n'est pas une perte de temps.
Merci.

mood
Publicité
Posté le 05-10-2009 à 12:19:27  profilanswer
 

n°1929086
Pascal le ​nain
Posté le 05-10-2009 à 18:49:27  profilanswer
 

C'est strictement équivalent d'après moi au niveau du résultat.
Après la deuxième solution est très brouillon et nécessite de faire 2 requètes en réalité...
C'est aussi une question de norme.
Quand tu gereras des requètes un peu plus complexes, tu utiliseras les jointures, car c'est plus propre, plus lisible, plus éditable, etc...
 
Compare les deux méthodes si tu as une dizaine de tables à joindre.
Dans la première méthode, tu as 10 lignes de INNER JOIN.
Dans la seconde, c'est 10 requètes imbriquées. Immonde !


Message édité par Pascal le nain le 05-10-2009 à 18:49:45
n°1930234
Profil sup​primé
Posté le 08-10-2009 à 15:10:15  answer
 

Merci

n°1930499
izzy
Posté le 09-10-2009 à 09:13:41  profilanswer
 

Oui, la première requête est beaucoup plus propre

n°1930508
kao98
...
Posté le 09-10-2009 à 09:30:29  profilanswer
 

Ce n'est pas qu'une question de lisibilité et de "propreté". Dans ce cas là, il est également surtout question de performances.
 
Dans le cas de la deuxième requête : le SGBD va d'abord exécuter la sous-requête. Puis la première requête. Puis, pour chaque enregistrement de ta table "comments", il va tester si l'user.id se trouve dans le jeu d'enregistrement de la table user.
 
Alors qu'avec la première requête, le SGBD contient des index qui lui permettent de trouver très rapidement les données que tu lui demande, en une seule requête, sans avoir d'autres tests à effectuer que le user.grades="admin". Ce sera beaucoup plus rapide, et ça va même permettre au SGBD de tenir des statistiques qui serviront plus tard à optimiser encore mieux son temps de travail pour des requêtes équivalentes.


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°1930514
Elmoricq
Modérateur
Posté le 09-10-2009 à 09:38:57  profilanswer
 

Le plan d'exécution est identique avec les deux requêtes. :o
Testé à l'instant, par contre je ne sais pas si c'est pas un optimiseur quelconque qui est venu fourrer son nez là-dedans au moment de l'exécution.

Message cité 1 fois
Message édité par Elmoricq le 09-10-2009 à 09:40:00
n°1930518
kao98
...
Posté le 09-10-2009 à 09:47:16  profilanswer
 

Elmoricq a écrit :

Le plan d'exécution est identique avec les deux requêtes. :o
Testé à l'instant, par contre je ne sais pas si c'est pas un optimiseur quelconque qui est venu fourrer son nez là-dedans au moment de l'exécution.


Avec quel SGBD ?
 
Je pense qu'un optimiseur est venu s'occuper de ça effectivement.
Pour une requête simple comme celle-ci, c'est effectivement pas un problème. Mais dans le cas général, il vaut mieux faut à tout prix éviter les "IN (SELECT ...)", surtout si c'est juste pour faire une jointure.
 


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
n°1930522
Elmoricq
Modérateur
Posté le 09-10-2009 à 09:50:25  profilanswer
 

Sybase 15 dans mon cas.

n°1930530
kao98
...
Posté le 09-10-2009 à 10:02:33  profilanswer
 

Sous SQL Server 2005, c'est également le même plan d'exécution.
 
N'empêche que c'est pas une habitude à avoir que d'utiliser des "IN (SELECT ..." :o
Et je suis sûr qu'avec un poil de complexité en plus, on peut tout faire péter le serveur :o²


---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Difference entre 2 commandes

 

Sujets relatifs
Difference Online / Offline (player music)difference entre int et long
Lancement de plusieurs commandes avec FOR les unes après les autres[C/C++] Difference entre pointeur et double pointeur ?
Différence IE / Firefox[excel] Question de noob sur les commandes IF
différence entre un ERP et un PGI?...Calcul de difference entre 2 dates dans 1 fichier 'Batch'
Différence entre pointeur et tableau, allocation dynamique et statiquerecherche commandes PCL
Plus de sujets relatifs à : Difference entre 2 commandes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR