IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Performance des requêtes SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Performance des requêtes SQL
    Bonjour,

    Comment choisir la meilleure requête SQL ?
    Pour un même résultat, j'ai le choix entre les trois requêtes ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /* 3 requetes pour le même résultat, laquelle est la meilleure ? */
     
    select art.ref1, uom.name
    from table1 art, table2 uom
    where art.ref1 like 'xxxxxx' and art.class_id=100 and uom.object_id=art.uom_id;
     
    select Ref1, (select name from table2 where object_id=uom_id)
    from table1
    where ref1 like 'xxxxxx' and class_id=100;
     
    select art.ref1, uom.name
    from table1 art
    inner join table2 uom on uom.object_id=art.uom_id
    where art.ref1 'xxxxxx' and art.class_id=100;
    Laquelle est la meilleure, en terme de performance et de syntaxe ?

    Merci pour vos conseils.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 102
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 102
    Points : 8 212
    Points
    8 212
    Billets dans le blog
    17
    Par défaut
    La 2e est une aberration à oublier.

    En terme de résultat et vitesse la 1re et la 3e devraient être équivalentes car dans la 1re l'optimiseur comprend que tu ne veux pas faire un produit cartésien (opérateur , ou CROSS JOIN) mais une jointure interne (critère dans le WHERE).

    La 3e, avec le INNER JOIN, est plus compréhensible par l'homme et représente mieux ton intention réelle, elle doit donc être privilégiée.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par Séb. Voir le message
    La 2e est une aberration à oublier.
    Pas nécessairement, les sous-requêtes scalaires ont leur utilité.

    C'est une forme de contrainte supplémentaire, la sous-requête ne pouvant retourner que zéro ou une ligne.
    Supposant que la colonne object_id porte une caractéristique primaire ou unique, cette contrainte est levée de facto.

    Typiquement pour ne retourner que quelques lignes sur un ensemble plus important, cette syntaxe peut être plus rapide à l'exécution que la version jointure.
    J'insiste sur le peut car il y a beaucoup trop d'inconnues sur un simple fil forum pour être affirmatif.
    Imaginez un dataset qui renvoie 20.000 lignes dans un site web mais qui ne veut afficher que 50 lignes par page.

    Sur une version ensembliste avec toutes les lignes retournées, la version jointure sera toujours la plus efficace (là je suis affirmatif).

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pas nécessairement, les sous-requêtes scalaires ont leur utilité.
    Je confirme, il m'est arrivé à plusieurs reprises de convertir des inner joins en requêtes scalaires, et ça a vraiment amélioré les perfs de la requête. A noter qu'il faut un index dans ce cas (sur la PK idéalement).

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 805
    Points
    30 805
    Par défaut
    En résumé, il n'y a pas de règle absolue.
    Il faut tester, comparer les plans d'exécution, réfléchir à l'indexation, ne pas oublier la mise à jour des statistiques...
    Et, sur une application critique, s'assurer que les choix effectués à un instant restent valides dans le temps avec l'évolution des volumes.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Déjà la requête 3 est fausse :

    where art.ref1 'xxxxxx'
    Ne veut rien dire. Je suppose que c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where art.ref1 LIKE  'xxxxxx'
    Ensuite cela dépend du SGBDR utilisé. Par exemple les requêtes 1 et 3 (rectifiée) seront récrites de la même façon avec un JOIN dans un bon SGBDR (SQL Server, IBM DB2, Oracle, PostGreSQL...). Mais cela nécessite plus de travail que l'écriture directe avec un JOIN...

    Ensuite la requête 2 peut être récrite comme la 3 (avec un JOIN) selon les contraintes présente dans les tables (PRIMARY KEY, UNIQUE, FOREIGN KEY...) notamment, sur un très bon SGBDR ((SQL Server, IBM DB2, Oracle...).

    Donc, ans connaître la structure des tables ni le SGBDR impossible à dire !

    Enfin cela dépend aussi des index créés !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre à l'essai
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Merci pour vos réponses.
    J'en conclue qu'il n'y a pas de règle absolue et que seul des tests en situation donne la solution.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 912
    Points
    38 912
    Billets dans le blog
    9
    Par défaut
    Oui, il faut tester, sachant qu'une même requête ne donnera pas les mêmes performances sur deux plates-formes distinctes (production et recette par exemple) ni à deux moments différents.
    En effet, l'optimiseur s'appuie sur les statistiques pour choisir son chemin d'accès, or celles-ci évoluent avec le contenu des tables et index (distribution des clefs différentes, fragmentation des espaces...)
    Ce faisant, valider les performances sur une plate-forme échantillon, comme celle de tests unitaires, est une erreur, car ça ne préjuge en rien des perfs en production.

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/10/2016, 13h49
  2. performance des requêtes SQL
    Par haykelFST dans le forum Développement
    Réponses: 3
    Dernier message: 20/10/2011, 18h28
  3. Journal des requêtes SQL effectuées
    Par Kcirtap dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 18/07/2005, 09h58
  4. Recherche ibrairie pour éxécuter des requêtes SQL via C++
    Par daemon dans le forum Choisir un environnement de développement
    Réponses: 5
    Dernier message: 14/06/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo