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 :

[Oracle 9i] Optimisation


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [Oracle 9i] Optimisation
    Bonjour.

    Je voudrais juste savoir s'il existe une autre écriture de ma requête ou si celle que j'ai choisi est optimisée.

    A la base, la logique est celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.ID
      FROM table1 t1
     WHERE EXISTS (SELECT 1
                     FROM table2 t2
                    WHERE t2.ID = t1.ID)
       AND NOT EXISTS (SELECT 1
                         FROM table3 t3
                        WHERE t3.ID = t1.ID)
    Que j'ai modifié ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.ID
      FROM table1 t1 INNER JOIN table2 t2 ON t2.ID = t1.ID
    MINUS
    SELECT t1.ID
      FROM table1 t1 INNER JOIN table3 t3 ON t3.ID = t1.ID
    Voyez-vous une autre possibilité?
    Merci.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Oui, selon la volumétrie des tables tu peux aussi essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.ID
      FROM table1 t1
     WHERE ID IN (SELECT ID
                     FROM table2)
       AND ID NOT IN (SELECT ID
                     FROM table3)
    Ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.ID
      FROM table1 t1, table2 t2
     WHERE t1.id = t2.id
       AND ID NOT IN (SELECT ID
                     FROM table3)
    Evidemment avec un index sur l'ID

  3. #3
    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
    "selon la volumétrie des tables": tout est là.

    Il me semblait que IN et NOT IN étaient plus gourmands que les EXISTS/NOT EXISTS.
    NB: il y a des index sur les colonnes en question.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    IN est plus performant si le groupe qu'il contient est petit

    Attention aussi, IN exclus les valeurs NULL et pas EXISTS... ce qui change le sens fonctionnel.

    A lire : http://asktom.oracle.com/pls/asktom/...D:442029737684

  5. #5
    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
    Il faut rajouter un distinct dans cette requête pour qu'elle soit égale en résultat à celle avec le IN / EXISTS, à moins d'être sûr d'être dans une relation (0,1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.ID
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.id
    AND ID NOT IN (SELECT ID FROM table3)

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    en effet

  7. #7
    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
    Merci pour le lien, orafrace, très intéressant.

    Citation Envoyé par Waldar Voir le message
    Il faut rajouter un distinct dans cette requête pour qu'elle soit égale en résultat à celle avec le IN / EXISTS, à moins d'être sûr d'être dans une relation (0,1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.ID
    FROM table1 t1, table2 t2
    WHERE t1.id = t2.id
    AND ID NOT IN (SELECT ID FROM table3)
    Je ne suis pas sûr d'avoir compris votre remarque (et je ne vois pas de distinct...).
    Avec quelle requête comparez-vous celle ci-dessus?

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

Discussions similaires

  1. [Oracle 9i] Optimisation clause not exists
    Par mjolymelot dans le forum Langage SQL
    Réponses: 7
    Dernier message: 23/08/2006, 17h20
  2. Oracle 9i - optimisation query
    Par goplay dans le forum Oracle
    Réponses: 1
    Dernier message: 21/06/2006, 17h10
  3. [Oracle 9i] Optimisation d'une requête
    Par Requin15 dans le forum Oracle
    Réponses: 14
    Dernier message: 20/06/2006, 11h37
  4. [Oracle 9i] Optimisation
    Par al_one dans le forum Oracle
    Réponses: 4
    Dernier message: 19/10/2005, 12h10

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