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

Oracle Discussion :

Optimisation de requête


Sujet :

Oracle

  1. #1
    Membre à l'essai

    Inscrit en
    Décembre 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 18
    Points : 21
    Points
    21
    Par défaut Optimisation de requête
    Bonjour à tous,

    J'ai un problème d'optimisation de requête . J'ai une requête :

    SELECT *
    FROM table1
    WHERE table1.chps1 IN (SELECT table2.chps1
    FROM table2
    WHERE table2.chps2 IN (SELECT table3.chps2
    FROM table3
    WHERE table3.chps2 IN (SELECT table4.chps2
    FROM table4)))


    Voici le plan d'exécution

    Etape Nom de l'étape

    9 SELECT STATEMENT
    8 NESTED LOOPS
    6 NESTED LOOPS
    4 NESTED LOOPS
    1 table1 TABLE ACCESS [FULL]
    3 table2 TABLE ACCESS [BY INDEX ROWID]
    2 table2PK INDEX [UNIQUE SCAN]
    5 table3PK INDEX [UNIQUE SCAN]
    7 table4PK INDEX [UNIQUE SCAN]

    Mon problème c est que le full access sur table1 qui fait 1 million d'enregistrements fait que la requête mais plus de 7 minutes pour s'exécuter.
    Je voudrais donc savoir si il est possible de modifier la requête pour qu'il n'y ait plus de full access sur ma table1.

    PS : j'ai essayé la clause EXISTS à la place du IN mais je dois être mauvais car lorsque je fais la requête :
    SELECT chps2 from table3 where exists (SELECT table4.chps2 FROM table4 where table4.chps2=table3.chps2)

    je me retrouve avec tous les chps2 de ma table3 alors que je ne devrais avoir que les valeurs de chps2 qui sont également table4.

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Va falloir prendre un cours de SQL sur les jointures.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT table1.* 
    FROM table1 , table2, table3, table4
    WHERE table1.chps1 = table2.chps1 
    AND table2.chps2 = table3.chps2 
    AND table3.chps2 = table4.chps2

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Et pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.*
    FROM table1 t1 INNER JOIN table2 t2 ON t1.chps1 = t2.chps2
                   INNER JOIN table3 t3 ON t2.chps2 = t3.chps2
                   INNER JOIN table4 t4 ON t3.chps2 = t4.chps2

  4. #4
    Membre à l'essai

    Inscrit en
    Décembre 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    merci pour vos réponses qui semblent donner le meme plan d'exécution. Effectivement il faudrait que je potasse de nouveau mes cours de base de données ce n'était pas bien compliqué.

    Encore merci

  5. #5
    Membre à l'essai

    Inscrit en
    Décembre 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Par contre dans quel cas est il judicieux d'utiliser la clause IN ?

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Dans plein de cas : le premier est le DELETE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE MATABLE1 WHERE col1 IN (SELECT col2 FROM MATABLE2)
    Ensuite par exemple si tu veux toutes les lignes de MATABLE1 ayant un code de MATABLE2 ayant SEL = 'O')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM MATABLE1 WHERE code IN (SELECT code FROM MATABLE2 WHERE SEL = 'O')
    Tu ne peux pas faire une jointure entre les 2 tables sinon, tes lignes de MATABLE1 seraient dupliquées autant de fois que le nb de code.

    Pour les cours, regarde le lien en haut. Y'en a des vraiment bien.

  7. #7
    Membre à l'essai

    Inscrit en
    Décembre 2003
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    ok et bien merci je met le sujet à "résolu".

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

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