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 :

Optimisation de requête decode not in decode


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut Optimisation de requête decode not in decode
    Bonjour,

    J'ai une requête qui prend beaucoup de temps à s'exécuter...

    J'aimerai qu' un pro du SQL me dise comment optimiser ma requête car je suis persuadé qu'il y a une manière beaucoup plus rapide...

    Déja en remplaçcant les decode par des case, ma requête est plus rapide, mais pas tant que ca. Je pense à quelque chose du genre exists à la place du in.

    Globalement, cette requête sert à récupérer des plans et formules associées à une entreprise modèle afin de les insérer dans une table (qui sera ensuite utilisée pour associer ces mêmes plans à d'autres entreprises...). L'idée est que certains plans sont contenus dans un même groupe (suivant leur type) et que je ne veux insérer dans la table (qui est en fait une table d'association entre entreprises et plans) uniquement les plans dont un autre plan du meme ensemble n'existe pas déja pour une entreprise.

    Ce qui me donne 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
     
    INSERT INTO MYTABLE (CODE_ENT, CODE_PLAN, CODE_FORMULE, NB_ABO)
     
    (
     
    SELECT E.CODE_ENT, P.CODE_PLAN, FP.CODE_FORMULE,0
     
    FROM
     
    ENTREPRISE E
     
    JOIN PLAN P ON (P.CODE_ENT = 60)
     
    LEFT JOIN FORMULE_PLAN FP ON (FP.CODE_PLAN = P.CODE_PLAN)
     
    WHERE 
        (E.CODE_ENT, DECODE(P.TYPE_PLAN,0,'ENSEMBLE1',1,'ENSEMBLE1',2,'ENSEMBLE2',3,'ENSEMBLE2',4,'ENSEMBLE1',5,'ENSEMBLE3',6,'ENSEMBLE2',7,'ENSEMBLE1'))
        NOT IN (
               SELECT CODE_ENT, DECODE(TYPE_PLAN,0,'ENSEMBLE1',1,'ENSEMBLE1',2,'ENSEMBLE2',3,'ENSEMBLE2',4,'ENSEMBLE1',5,'ENSEMBLE3',6,'ENSEMBLE2',7,'ENSEMBLE1')
               FROM PLAN P1
               WHERE P1.CODE_ENT IN (SELECT CODE_ENT FROM ENTREPRISE E WHERE E.CODE_GROUPE = 200 )
               )
     
    AND E.CODE_GROUPE = 200
    AND E.CODE_ENT != 60
     
    );
    Ce qui prend énormément de temps c'est le decode(...) not in decode(...).

    Est ce que quelqu'un est capable de me transformer ca en utilisant "exists" ?

    Merci d'avance.

  2. #2
    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
    Et si tu utilisais une table de correspondance plutôt que passer par DECODE ?
    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.

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut
    J'avoue c'est la meilleure solution.

    Mais en fait, en remplaçant par des case, la requête est vraiment beaucoup plus rapide, donc je n'aurai pas besoin...

    Merci pour la suggestion en tout cas

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

Discussions similaires

  1. Optimisation requête jointure NOT IN
    Par pop_up dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 05/11/2014, 16h41
  2. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  3. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  4. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09
  5. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 15h20

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