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

SQL Oracle Discussion :

Optimisation de requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut Optimisation de requête
    Bonjour,

    Sur le projet, il y a 3 tables reliées par une association, la 3e table servant à définir le type de l'association
    J'ai une requête entre 1 de ces tables et l'association. Comme on sait que type d'association on veut, on s'arrête à l'association mais on l'interroge plusieurs fois, pour chaque type que l'on veut.
    Avec un ex ca sera peut être plus clair

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
    FROM table t, asso a1, asso a2 ...
    WHERE t.code = a1.code
    AND a1.type = 'TYPE1'
    AND t.code = a2.code
    AND a2.type = 'TYPE2'
    Ce qui fait donc interroger la table d'association plusieurs fois.
    Il faut que tous les types soient ramenés sur la même ligne et ne pas générer une ligne par type.

    Y a-t-il un moyen de n'interroger la table d'association qu'une seule fois tout en ayant les infos sur la même ligne ce qui me permettrait surement d'optimiser la requête.

    Merci de votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Par défaut
    Bonjour,
    Peux tu mettre un exemple de résultat que tu souhaites obtenir, ainsi que la structure de tes tables.
    Cordialement.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Il y a les tables : DOSS ( ID_DOSS VARCHAR2 ...)
    SOCIETE (ID_ENT NUMBER ..)
    TYPE (ID_TYPE ...)
    Et la table d'association : CONCERNER (ID_DOSS, ID_ENT, ID_TYPE)
    Pour un dossier, il peut y avoir plusieurs sociétés et les sociétés sont présentes sur plusieurs dossiers , tout ca avec des types différents

    Pour un dossier, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT ID_ENT, ID_TYPE FROM CONCERNER a, DOSS d
    WHERE a.ID_DOSS = d.ID_DOSS
    AND ID_DOSS=1
    AND ID_TYPE IN ('GEST','BENEF')
     
    ID_ENT    ID_TYPE
    -------    --------
    1            BENEF
    2            GEST
    Moi je veux comme résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ID_ENT_BENEF     ID_TYPE    ID_ENT_GEST    ID_TYPE
    -------------      --------    -------------    --------
    1                       BENEF        2                   GEST
    Donc pour ce faire je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID_ENT, ID_TYPE FROM CONCERNER a_gest, CONCERNER a_benef, DOSS d
    WHERE ID_DOSS=1
    AND a_gest.ID_DOSS = d.ID_DOSS
    AND a_gest.ID_TYPE = 'GEST'
    AND a_benef.ID_DOSS = d.ID_DOSS
    AND a_benef.ID_TYPE = 'BENEF'
    Ca me donne bien le résultat que je veux mais ca oblige à interroger 2 fois la table d'association et ca me gêne
    Je voudrais savoir s'il existe une méthode pour éviter ca

  4. #4
    Membre confirmé
    Homme Profil pro
    Médecin.
    Inscrit en
    Septembre 2008
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Médecin.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 96
    Par défaut
    Tu peux essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Select ID_DOSS ,
    (case when  ID_TYPE = 'BENEF' then ID_ENT_BENEF),
    (case when  ID_TYPE = 'BENEF' then ID_TYPE),
    (case when  ID_TYPE = 'GEST' then ID_ENT_GEST),
    (case when  ID_TYPE = 'GEST' then ID_TYPE)
    from DOSS d join CONCERNER a_gest
    on d.ID_DOSS = a_gest.ID_DOSS ;
    Je n'ai pas testé !
    Bon courage.

  5. #5
    Membre Expert Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Par défaut
    Tu peux passer de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT a_gest.ID_ENT, a_gest.ID_TYPE,  a_benef.ID_ENT, a_benef.ID_TYPE, d.ID_DOSS FROM CONCERNER a_gest, CONCERNER a_benef, DOSS d
    WHERE ID_DOSS=1
    AND a_gest.ID_DOSS = d.ID_DOSS
    AND a_gest.ID_TYPE = 'GEST'
    AND a_benef.ID_DOSS = d.ID_DOSS
    AND a_benef.ID_TYPE = 'BENEF'
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    'GEST', max(decode(a.ID_TYPE, 'GEST', a_gest.ID_ENT))
    ,'BENEF', max(decode(a.ID_TYPE, 'BENEF', a_gest.ID_ENT))
    ,d.ID_DOSS
    FROM CONCERNER a, DOSS d
    WHERE ID_DOSS=1
    AND a.ID_DOSS = d.ID_DOSS
    AND a.ID_TYPE in ('GEST', 'BENEF')
    group by
    'GEST', 'BENEF', d.ID_DOSS
    mais de là à dire que ce sera plus performant...

    Quels sont tes problèmes de performances ?

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Bah en fait ca ne donne pas ce que je veux.

    Il n'y a pas encore d'alertes de perf mais quand j'ai vu la requête avec la table d'association qui grossit énormément et qui est interrogé plusieurs fois, j'essaye de prendre les devants.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Qu'est-ce qui ne convient pas dans la requête de nuke_y ?
    À la syntaxe ANSI près j'aurai présenté la même idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      SELECT d.ID_DOSS,
             max(case a.ID_TYPE when 'GEST'  then a_gest.ID_ENT end) as ID_ENT_GEST ,
             max(case a.ID_TYPE when 'BENEF' then a_gest.ID_ENT end) as ID_ENT_BENEF
        FROM CONCERNER a
             INNER JOIN DOSS d
               ON d.ID_DOSS = a.ID_DOSS
       WHERE d.ID_DOSS = 1
         AND a.ID_TYPE IN ('GEST', 'BENEF')
    GROUP BY d.ID_DOSS
    ORDER BY d.ID_DOSS ASC;

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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