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 :

Jointure et requetes imbriquées : amélioration des performances


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut Jointure et requetes imbriquées : amélioration des performances
    Bonjour !

    Soit la requête suivante :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    select 
        CIVILITE,
        NOM,
        PRENOM,
        CODE_POSTAL,
        VILLE,
        TELEPHONE,
        EMAIL,
        NUM_ADHERENT
    from 
        utilisateur 
    where
        CO_COURTAGE = "359-3303-2004" 
        and CO_PROFIL="clien" 
    UNION
    select 
        CIVILITE,
        NOM,
        PRENOM,
        CODE_POSTAL,
        VILLE,
        TELEPHONE,
        EMAIL,
        "Inexistant" as NUM_ADHERENT 
    from 
        client 
    where 
        ID_CLIENT_PREMAVALS 
        not in 
        (
            select 
                ID_CLIENT_PREMAVALS
            from 
                utilisateur 
            where CO_COURTAGE = "359-3303-2004"
            and CO_PROFIL="clien" 
        ) 
        and CO_COURTAGE = "359-3303-2004"
    TABLE UTILISATEUR :
    CIVILITE
    NOM
    PRENOM
    CODE_POSTAL
    VILLE
    TELEPHONE
    EMAIL
    NUM_ADHERENT
    TABLE CLIENT :
    CIVILITE
    NOM
    PRENOM
    CODE_POSTAL
    VILLE
    TELEPHONE
    EMAIL
    Ma requete fonctionne très bien lors de mes tests comportant qu'une dizaine d'enregistrement.
    Seulement, lorsque j'utilise ma vraie base de données, qui elle contient 15 000 enregistrement par table, le temps d'execution est beaucoup trop long et je ne pourrais pas utiliser ma requete dans mon application.

    je voudrais donc optimisr ma requete pour réduire son temps d'execution.

    je sui sure que je dois utiliser une jointure externe, mais mon niveau en sql est tellement faible, que je ne m'en sors pas. Quelqun'un peut -il m'aider ?

    merci

  2. #2
    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
    Essayez ceci :
    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
    16
    17
    SELECT
        COALESCE(u.CIVILITE, c.CIVILITE)       AS CIVILITE,
        COALESCE(u.NOM, c.NOM)                 AS NOM,
        COALESCE(u.PRENOM, c.PRENOM)           AS PRENOM,
        COALESCE(u.CODE_POSTAL, c.CODE_POSTAL) AS CODE_POSTAL,
        COALESCE(u.VILLE, c.VILLE)             AS VILLE,
        COALESCE(u.TELEPHONE, c.TELEPHONE)     AS TELEPHONE,
        COALESCE(u.EMAIL, c.EMAIL)             AS EMAIL,
        COALESCE(u.NUM_ADHERENT, 'Inexistant') AS NUM_ADHERENT
    FROM 
        client c
        LEFT OUTER JOIN utilisateur u
          ON u.ID_CLIENT_PREMAVALS = c.ID_CLIENT_PREMAVALS
         AND u.CO_COURTAGE = '359-3303-2004'
         AND u.CO_PROFIL = 'clien'
    WHERE
        c.CO_COURTAGE = '359-3303-2004'

  3. #3
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    Whoah merci ça marche très bien ! C'est parfait !

    Merci, merci, merci !


  4. #4
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    Re-bonjour !
    je pensais que la requête de Waldar fonctionnait bien, mais elle n'est pas assez optimisée. En locale elle met environ 9 secondes pour s'executer. Une fois sur le réseau, l'utilisateur n'attendras jamais que cela s'affiche.

    Y a t'il une autre méthode d'optimisation ?

    Voila la requete de Waldar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    COALESCE(u.NOM, c.NOM) AS NOM, COALESCE(u.PRENOM, c.PRENOM) AS PRENOM, COALESCE(u.CODE_POSTAL, c.CODE_POSTAL) AS CODE_POSTAL, COALESCE(u.VILLE, c.VILLE) AS VILLE, COALESCE(u.TELEPHONE, c.TELEPHONE) AS TELEPHONE, COALESCE(u.EMAIL, c.EMAIL) AS EMAIL, COALESCE(u.NUM_ADHERENT, "Inexistant") AS NUM_ADHERENT
     FROM 
    client c LEFT OUTER JOIN utilisateur u 
    ON
     u.ID_CLIENT_PREMAVALS = c.ID_CLIENT_PREMAVALS AND u.CO_COURTAGE = "359-3303-2004" AND u.CO_PROFIL = "clien"
     WHERE
     c.CO_COURTAGE = "359-3303-2004" 
    order by NOM, PRENOM ASC

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Regardez plutot du coté des index.
    Quels index avez vous défini sur vos tables?

  6. #6
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    Je n'ai défini aucun index. Sur quel champs il faudrait que j'en ajoute un pour que ça fonctionne bien ? CO_COURTAGE ?

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Réponse par ici...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Pour simplifier, le minimum syndical serait d'indexer les clés primaires et étrangères de vos tables.
    On ne connait pas la structure de vos tables, mais à priori vous pouvez déjà créer deux index : client(ID_CLIENT_PREMAVALS) et utilisateur(ID_CLIENT_PREMAVALS).
    Comme vous avez une petite volumetrie, ces deux index devraient suffire.

    Mais vous pouvez également indexer les colonnes sur lesquelles portent souvent les recherches, sur votre exemple CO_COURTAGE.
    Si vos clauses WHERE portent souvent sur cette colonne, et qu'elle contient suffisamment de valeurs différentes, l'indexer peut être intéressant.

  9. #9
    Membre du Club Avatar de sarah65536
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Points : 59
    Points
    59
    Par défaut
    merci pour la doc. J'en avais trouvé une autre mais beaucoup moins complète.

    Les index sur les clés sont déjà définis. J'ai ajouté sur le CO_COURTAGE, et maintenant ça fonctionne très bien.

    Merci pour vos super conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. jointure ou requete imbriquée
    Par cdsoft dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/01/2009, 14h24
  2. Requetes imbriquées dans des while -> rationnalisation
    Par zephilou dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/06/2008, 14h20
  3. [Administration] Amélioration des performances
    Par ced dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 09/06/2008, 09h02
  4. Différence entre jointure et requetes imbriquées
    Par sliderman dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/04/2008, 09h24
  5. Réponses: 2
    Dernier message: 23/08/2007, 12h22

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