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 :

Utilisation d'une union


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Utilisation d'une union
    Bonjour à tous,

    J'ai une grosse lenteur sur ce genre de requête :

    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
     
    SELECT
       CUST.CUSTID,
       CUST.CUSTCODE,
       CUST.NAME
    FROM
       CUSTOMERS CUST
    WHERE
       CUSTID IN
         SELECT
            CUSTID
         FROM
            ORDERS
         WHERE
            ...
       UNION
        SELECT
           CUSTID
        FROM
           XXX
        WHERE
           ...
      UNION
       SELECT
          CUSTID
       FROM
          YYY
       WHERE
          ...
    En gros je souhaite récupérer des infos clients qui remplissent 3 conditions (mes trois sous requêtes unies).
    Chaque sous requête qui récupère les identifiants sont rapide à exécuter. Mais sélectionner les infos clients sont l'identifiant est compris dans une de ces trois requêtes est très long à exécuter...

    J'ai tenté, au lieu de faire une union, de faire 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
    18
    19
    20
     
    SELECT
       CUST.CUSTID,
       CUST.CUSTCODE,
       CUST.NAME
    FROM
       CUSTOMERS CUST
    WHERE
       CUSTID IN
       (
         SELECT CUSTID FROM ORDERS ...
       )
       OR CUSTID IN
       (
         sous requête 2
       )
       OR CUSTID IN
       (
         sous requête 3
       )
    Mais rien à faire, c'est toujours très long

    Est-ce qu'il y a quelque chose de plus optimisé pour faire ce genre de sélection ?

    Merci beaucoup,

    A bientôt

  2. #2
    Membre habitué
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    14
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 14
    Par défaut
    Le probleme de lenteur est dû au fait que tu utilise Union ; tu pourrais utiliser Union all si t'as aps de probleme de doublon et peut etre faire select distinct au besoin

  3. #3
    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
    Essayez de placer votre union dans le FROM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        CUST.CUSTID,
        CUST.CUSTCODE,
        CUST.NAME
    FROM
        CUSTOMERS CUST
        INNER JOIN 
        (SELECT CUSTID FROM ORDERS WHERE ...
        UNION
        SELECT CUSTID FROM XXX WHERE ...
        UNION
        SELECT CUSTID FROM YYY WHERE...) OC
          ON OC.CUSTID = CUST.CUSTID

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Merci pour vos réponses.

    Finallement j'ai préféré faire en plusieurs requêtes étant donné que je ne dois pas charger tous les clients selon le contexte de mon application.

    Donc pour un cas, je charge une série de client (faisant parti d'un de mes "union") sans les autres, puis ensuite charger la seconde série de client sans la première etc...

    Quoi qu'il en soit je vais tester vos solutions (quoi que le UNION ALL n'a rien amélioré) car je suppose que ce problème est courant, donc autant être prévenu

    Merci beaucoup,

    A bientôt

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Bonjour.
    Le "IN" n'est pas optimal en terme de ressources. En partant de la requête originale, vous pouvez essayer 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
    18
    19
    20
    21
    SELECT
       CUST.CUSTID,
       CUST.CUSTCODE,
       CUST.NAME
    FROM
       CUSTOMERS CUST,
       (SELECT
            CUSTID
         FROM
            ...
       UNION
        SELECT
           CUSTID
        FROM
           ...
      UNION
       SELECT
          CUSTID
       FROM
          ...) MA_VUE
    WHERE CUST.CUSTID = MA_VUE.CUSTID

  6. #6
    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
    Excellente solution Goldoz ! Mais je vous ai précédé de deux jours

  7. #7
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 43
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Merci pour vos réponses.

    Quoi qu'il en soit je vais tester vos solutions (quoi que le UNION ALL n'a rien amélioré) car je suppose que ce problème est courant, donc autant être prévenu

    A bientôt
    les résultats de l'UNION dans la clause FROM sont certes visbles à l'immédiat, mais je pense qu'il également judicieux d'utiliser le UNION ALL à la aplace du UNION. Ceci aura un impact certain, beaucoup plus à long terme.

  8. #8
    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
    Citation Envoyé par nwaitic Voir le message
    les résultats de l'UNION dans la clause FROM sont certes visbles à l'immédiat, mais je pense qu'il également judicieux d'utiliser le UNION ALL à la aplace du UNION. Ceci aura un impact certain, beaucoup plus à long terme.
    Le UNION ALL dans le IN n'est pas problématique, c'est juste une contrainte d'existence.

    Le UNION dans le FROM est nécessaire sous peine de générer des doublons.
    On peut compenser par un DISTINCT au niveau du SELECT, mais entre faire un distinct sur toute la requête ou sur une partie de la requête, mon choix est vite vu.

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

Discussions similaires

  1. [CR 7] report qui utilise une union de table ?
    Par belaggoun2000 dans le forum SAP Crystal Reports
    Réponses: 16
    Dernier message: 29/01/2010, 10h40
  2. Union d'une vue utilisant aussi l'union
    Par lavazavio dans le forum Langage SQL
    Réponses: 0
    Dernier message: 03/06/2009, 16h58
  3. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  4. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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