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 :

[Oracle 9i] Optimisation clause not exists


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut [Oracle 9i] Optimisation clause not exists
    Bonjour,

    Je travaille sur une bdd Oracle 9i.
    Je cherche à optimiser une clause NOT EXISTS.

    Je sais que pour la clause EXISTS, il est possible d'utiliser 1 = (select count(1) ...)
    Par contre, je n'arrive pas à reformuler sous le même format la clause NOT EXISTS.

    Merci.
    M JOLYMELOT

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Je n'ai pas bien compris ce que tu voulais dire ?

    Pour moi, une clause dans un NOT EXISTS s'écrit de la même manière que dans une clause EXISTS, non ?

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Champ1_1
      FROM Table1
     WHERE NOT EXISTS (SELECT Champ2_2
                                 FROM Table2
                                WHERE  Champ2_1 = Champ1_1)

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Je suis d'accord.
    Par contre, il y a moyen d'optimiser.

    Exemple:
    select t.sigtie
    from tie t
    where exists (select e. sigtie
    from eve e
    where e.sigtie = t.sigtie)
    équivaut à

    select t.sigtie
    from tie t
    where 1 = (select distinct 1
    from eve e
    where e.sigtie = t.sigtie)

    TIE comporte 3836 enreg.
    EVE en comporte 3197.

    avec le EXISTS, tps de réponse: 100msec.
    avec 1=, tps de réponse: 20 msec.

    Je souhaiterais faire la même chose pour le NOT EXISTS.

    Merci.
    M JOLY MELOT

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Comme pour EXISTS, il te suffit de rajouter NOT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t.sigtie 
      FROM tie t
     WHERE NOT 1 = (select distinct 1 from eve ewhere e.sigtie = t.sigtie)

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Cela ne fonctionne pas.

    TIE : 3836 enreg

    avec clause 1= : 40 enreg ramenés
    donc avec clause not 1= : 3796 enreg attendus

    or 0 enreg retourné.

  6. #6
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Autant pour moi, j'ai dit une grosse ânerie, la clause ne peut jamais être vraie ...

    Mais avec une jointure externe, ça devrait le faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT t.sigtie, e.sigtie
      FROM tie t LEFT OUTER JOIN eve e ON t.sigtie = e.sigtie
     WHERE e.sigtie IS NULL;

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    OK.

    ça a l'air plus intéressant point de vue explain plan mais ça ne change rien côté temps d'exécution.

    Merci.
    M JOLY MELOT

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Avec des volumétries aussi faibles, je suis étonné du temps de réponses de l'ordre de 100 ms : les champs "sigtie" sont-ils indexés sur les 2 tables ?

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

Discussions similaires

  1. Requète clause not exists
    Par frabeau dans le forum VBA Access
    Réponses: 1
    Dernier message: 10/11/2011, 19h08
  2. Probleme clause NOT EXISTS et NOT IN
    Par Jarod51 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/07/2010, 08h42
  3. [ASE 12.5.4] Optimisation requête + not existes
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 09/01/2010, 14h19
  4. Réponses: 6
    Dernier message: 31/07/2009, 21h43
  5. package oracle.jdbc.driver does not exist
    Par kimcharlene dans le forum JDBC
    Réponses: 3
    Dernier message: 17/01/2007, 21h07

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