Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/12/2010, 18h10   #1
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 947
Points : 5 947
Par défaut Optimisation de requête avec jointures

Bonsoir.

Je ne suis pas un grand expert du SQL mais je me posais une question depuis quelque temps à laquelle je n'ai pas eu de réponses.

Alors je vous la pose ici :

Il y a quelque temps, j'ai appris que ce type de requête avec jointure (en SQL 89 parce qu'en cours on en est toujours au SQL 89* ) :

Code sql :
1
2
3
4
SELECT t1.*
FROM t1, t2
WHERE un_champ_qcq = 'une valeur qcq'
AND t1.pk_id = t2.pk_id;

était plus optimisé que ce type de requête (SQL 89 toujours) :

Code sql :
1
2
3
4
SELECT t1.*
FROM t1, t2
WHERE t1.pk_id = t2.pk_id
AND un_champ_qcq = 'une valeur qcq';

car on limite le nombre d'occurrences avant de faire la jointure (plutôt que de faire la jointure sur toutes les occurrences et limiter après).

Je me suis donc demandé, si cette optimisation était conservée en SQL 92 avec ce type de requête :

Code sql :
1
2
3
SELECT t1.*
FROM t1 INNER JOIN t2 ON t1.pk_id = t2.pk_id
WHERE un_champ_qcq = 'une valeur qcq';

En gros est-ce que cette requête va se comporter comme la première ou comme la seconde ? Logiquement la jointure est effectué avant la clause WHERE (avant donc de limiter le nombre d'occurrences) mais je n'en avais pas la certitude ...

Je n'ai pas de base assez grosse sous la main pour voir une différence. J'ai donc demandé au prof qui n'en savais rien lui non plus ...

Et vous, avez-vous une idée ? merci d'avance

Cordialement,
Idriss

P.S : j'ai aussi testé le temps d'exécution sur une base MySQL avec PHPMyAdmin mais je ne suis pas sûr de l'entière fiabilité car pour une même requête (avec les mêmes occurrences), le temps d'exécution varie ...

* pour les jointures internes seulement
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 18h30   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Fort heureusement l'ordre des filtres et des tables n'ont plus d'importance dans les performances depuis longtemps !

On le constate en regardant les plans et les traces d'exécutions.

Vos trois requêtes sont donc parfaitement équivalentes en terme de performance.
Seule la dernière est correctement écrite bien entendu !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 18h39   #3
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 947
Points : 5 947
Merci de la réponse (donc ce qu'on nous apprends en cours n'est plus d'actualité tout comme le SQL employé ).

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 20h40   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 948
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 948
Points : 17 762
Points : 17 762
Je modère les propos :
ceci est vrai, si vous êtes sur un bon SGBDR, c'est à dire pas sur un SGBDR fichier genre Access et bien entendu pas sous MySQL !!!!

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 20h44   #5
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 947
Points : 5 947
Citation:
Envoyé par SQLpro Voir le message
ceci est vrai, si vous êtes sur un bon SGBDR, c'est à dire pas sur un SGBDR fichier genre Access et bien entendu pas sous MySQL !!!!
J'utilise postgreSQL (pour les applications locales ou intranets) et MySQL (sites webs hébergés) ... sous MySQL donc, la requête SQL 92 se comporterait comme la seconde requête SQL 89 ?

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h39.


 
 
 
 
Partenaires

Hébergement Web