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 :

"Optimiser" une requête


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Symfony2
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Symfony2
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Par défaut "Optimiser" une requête
    Bonjour,

    J'ai un problème assez simple / basique, j'ai cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [...] 
    FROM A,B 
    WHERE A.Z =B.Z AND T = 12 
    OR  A.Z =B.Z AND T = 2
    Je présume qu'il y a un moyen plus simple pour arriver au méme résultat, car une condition est commune: A.Z =B.Z

    Des idées ?
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,


    déjà la syntaxe des jointures est normalisée de cette manière depuis plus de 20 ans :
    http://sqlpro.developpez.com/cours/s...ointures/#LIII


    Ensuite, pour quoi mettre 2 fois vos conditions de jointure ? utilisez des parenthèses ou un "IN"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select *
    from table_a a
    inner join table_b b on a.z = b.z
    where t in (2, 12)

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Première étape : factoriser les conditions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  [...] 
    FROM    A,B 
    WHERE   A.Z = B.Z 
        AND (T = 12 OR  T = 2)
    ;
    C'est de l'algèbre de Boole, tout simplement.

    Seconde étape : utiliser un opérateur mieux adapté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  [...] 
    FROM    A,B 
    WHERE   A.Z = B.Z 
        AND T IN (12, 2)
    ;
    Troisième étape : écrire les jointures sous leur forme normalisée depuis deux décennies.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  [...] 
    FROM    A
        INNER JOIN
            B 
            ON  A.Z = B.Z 
    WHERE   T IN (12, 2)
    ;
    Et c'est tout de suite beaucoup plus lisible
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Symfony2
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Symfony2
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Par défaut
    Ensuite, pour quoi mettre 2 fois vos conditions de jointure ? utilisez des parenthèses ou un "IN"
    C'était justement ma question c'était tout bête, mais ça ne me venait pas...

    Pour la petite histoire, en DUT on m'a apprit le JOIN ON
    Que j'utilisais donc..

    Puis à la fac, on m'a dit que c'était la méme chose et que l'on pouvait utiliser les deux.. Donc selon mon humeur..
    Mais je ne savais pas que c'était normalisé depuis si longtemps, on aurait du nous le préciser qu'il y avait cette différence ^^
    Résolus donc, merci à vous

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Ton professeur de fac devrait être brûlé sur un bûcher.

    En effet, si au premier abords les deux syntaxes sont équivalentes :

    La jointure "from table1, table2 where ..." :
    1/ n'est pas une jointure, mais un produit cartésien
    2/ le filtre contient des critères de jointure qui n'ont rien d'un filtre
    1 + 2 => Sémantiquement, c'est donc complètement faux. L'optimiseur est donc pénalisé et doit réécrire complètement la requête pour pouvoir l'exécuter. Certains vieux SGBD en sont incapables.
    3/ N'est pas normalisée pour les jointures externes : selon le SGBD, on va avoir des "(+)" ajoutés derrière le nom des champs, ou un opérateur "*=".
    4/ Dans tous les cas, on ne peux pas faire de jointure externe en utilisant d'autres opérateurs que "=".
    5/ Les jointures en cascade sont pour ainsi dire impossible à écrire, et leur comportement n'est pas modulable sans se lancer dans des imbrications de sous-requêtes.
    6/ On ne peut faire que des jointures ouvertes droites ou gauches, pas de full
    3 + 4 + 5 + 6 => D'un point de vue lisibilité et fonctionnalités, les deux syntaxes ne sont donc absolument pas équivalentes.

    Bref : la normalisation SQL-92 est "obligatoire" si tu veux à la fois écrire un code propre, compréhensible, maintenable, optimisé et pouvoir profiter au mieux des possibilités de l'algèbre ensembliste pour interroger le SGBD.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Symfony2
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Symfony2
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Par défaut
    Merci pour cette réponse,

    En effet, je ne fais pas de requêtes très compliquées pour le moment, et je vais attendre ma note de bdd avant de proposer à mes camarades de brûler notre professeur

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Ton professeur de fac devrait être brûlé sur un bûcher.
    ...
    Ben dis donc tu lui en as mis un couche !!!! Fais gaffe tu risque de devenir pire que moi !!!!

    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/ * * * * *

  8. #8
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    ... En effet, si au premier abords les deux syntaxes sont équivalentes ...
    Ben si ... pour les jointures internes (INNER JOIN) c'est strictement identique ...

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Symfony2
    Inscrit en
    Novembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur Symfony2
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2008
    Messages : 48
    Par défaut
    Re Bonjour !

    J'ai donc cette requête là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  [...] 
    FROM    A
        INNER JOIN
            B 
            ON  A.Z = B.Z 
    WHERE   T IN (12, 2)
    ;
    Dans ma table T est un historique et a une valeur de 0 à 15
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID - VAR
    1 - 2 
    2 - 2
    2 - 4
    Je ne veux sélectionner que les lignes qui ont 2 ou 12 dans leur historique mais je ne veux pas les sélectionner si d'autres lignes ont 4 dans leur historique par exemple, même si elles ont 2 ou 12 !
    Donc ici, je veux la ligne avec l'id 1 mais pas celle avec l'id 2 !

    Comment je pourrais faire ça ?

Discussions similaires

  1. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  2. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  3. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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