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 :

Requête qui rame: CREATE TABLE + NOT IN + INNER JOIN


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 163
    Points : 76
    Points
    76
    Par défaut Requête qui rame: CREATE TABLE + NOT IN + INNER JOIN
    Bonjour,

    Je récupère du code et malheureusement je ne maîtrise pas encore les INNER JOIN et comment les contourner. J'ai donc une requête qui se déroule pas trop mal tant qu'il n'y a pas de trop de données mais qui mets plus d'une demi-heure lorsque j'ai 30000 enregistrements. Est-ce que quelqu'un peut me dire comment puis-je l'améliorer?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE R_INSERT AS select rownum as ID, RPLAN, VRS, 
    SCODE, SCLASS, IMP_CAT, TMODEL, TZONE, MOD_SEL, PMODEL, 
    ALT_PMODEL, PSTHR, A_TYPE, A_CHARGE, INFO from R_UPDATE WHERE 
    (IMP_CAT, RPLAN, nvl(SCLASS,'*'), SCODE, TMODEL, TZONE, VRS) 
    NOT IN ( select IMP_CAT, RPLAN, nvl(SCLASS,'*'), 
    SCODE, TMODEL, TZONE, VRS FROM R_UPDATE INNER JOIN R_INIT USING 
    (IMP_CAT, RPLAN, SCLASS, SCODE, TMODEL, TZONE, VRS))
    D'avance merci.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Qu'est-ce que vous voulez faire technico-fonctionnellement ?

    Insérer dans R_INSERT les données de R_UPDATE n'existant pas dans R_INIT ?

  3. #3
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Si tu veux créer une table avec les R_UPDATE qui ne sont pas dans R_INIT, tu fais une étape superflue dans ta requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE R_INSERT AS 
    SELECT rownum AS ID, RPLAN, VRS, 
    SCODE, SCLASS, IMP_CAT, TMODEL, TZONE, MOD_SEL, PMODEL, 
    ALT_PMODEL, PSTHR, A_TYPE, A_CHARGE, INFO 
    FROM R_UPDATE 
    WHERE  (IMP_CAT, RPLAN, nvl(SCLASS,'*'), SCODE, TMODEL, TZONE, VRS) 
    NOT IN ( SELECT IMP_CAT, RPLAN, nvl(SCLASS,'*'), SCODE, TMODEL, TZONE, VRS 
    JOIN R_INIT)
    Ensuite pour les performances, il faudrait le plan d'exécution

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    De ce que je comprends OUI, je veux dans R_INSERT les R_UPDATE qui ne sont pas dans R_INIT.
    Je vais déjà essayer d'enlever le USING comme tu me proposes.
    Merci.
    Si vous avez d'autres idées, je prends. :-)

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Avec NOT EXISTS aussi ça devrait le faire :
    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
    CREATE TABLE R_INSERT
    AS
    SELECT rownum AS ID,
           RPLAN,
           VRS,
           SCODE,
           SCLASS,
           IMP_CAT,
           TMODEL,
           TZONE,
           MOD_SEL,
           PMODEL,
           ALT_PMODEL,
           PSTHR,
           A_TYPE,
           A_CHARGE,
           INFO
      FROM R_UPDATE rup
     WHERE NOT EXISTS (SELECT NULL
                         FROM R_INIT rin 
                        WHERE rin.IMP_CAT = rup.IMP_CAT
                          AND rin.RPLAN   = rup.RPLAN
                          AND rin.SCLASS  = rup.SCLASS
                          AND rin.SCODE   = rup.SCODE
                          AND rin.TMODEL  = rup.TMODEL
                          AND rin.TZONE   = rup.TZONE
                          AND rin.VRS     = rup.VRS);

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    Merci. Je vais essayer ça et mesurer les temps, je vous tiendrai au courant.

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    163
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    Merci pour vos réponse. Le problème ne résidait pas dans la complexité de mon select mais dans la table que j'interrogeais, il s'agissait d'un table temporaire non indexée, ce qui explique pourquoi elle prenait autant de temps. Du coup, plutôt que d'interrogé cette table, j'ai refondu la requête pour elle interroge la vue qui contenait toutes les informations. Je suis passée de une heure à 2 secondes. :-)

    Encore merci

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 19/06/2009, 21h59
  2. Réponses: 2
    Dernier message: 17/06/2009, 11h16
  3. comment formuler une requête qui joingne trois tables
    Par s.mustapha86 dans le forum Hibernate
    Réponses: 4
    Dernier message: 30/07/2008, 20h33
  4. Réponses: 2
    Dernier message: 25/06/2008, 14h58
  5. Requête qui interroge 3 tables
    Par louroulou dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/07/2007, 11h34

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