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 :

la différence entre in et EXISTS


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 98
    Par défaut la différence entre in et EXISTS
    salut
    voila ma question est simple c'est quoi la différence entre in et EXISTS ??

    car pour moi je peux avec les deux je peux avoir le même résulta
    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM Client cli
    	WHERE	
    	EXISTS (SELECT * FROM Commande cmd
    		WHERE
    		Cmd.NumCli = cli.NumCli);
    ou bien avec in

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM Client cli
    	WHERE	
    	cli.NumCli in  (SELECT Cmd.NumCli  FROM Commande cmd);

    merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    L'existence d'un enregistrement (EXIST) est différent de la présence d'une valeur dans une liste (IN), es-tu d'accord ?
    Il se trouve que tes requêtes ramènent la même chose mais de façons différentes.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Par défaut
    Comme le dit Jérome, 'un point de vue sémantique, c'est la même chose. je ne pense pas qu'il y ait une condition que l'on peut ecrire avec l'un et pas avec l'autre.

    Malheureusement, d'un point de vue performance, les plans utilisés par Oracle entre deux requettes "sémantiquement identiques", l'une en in l'autre en exists, ne sont pas toujours les mêmes.

    Autre point : ce que ramene la sous requette du IN peut ramener une valeur null dans la liste... Cela peut donner des resultats étranges. (Not in).

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Pour ajouter à ce qui a été dit, IN ramène toutes les valeurs trouvées (et lit donc toute la table), alors que EXISTS retourne TRUE dès la première valeur trouvée, ce qui explique (en partie) les différences de plan d'exécution.

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Petit remarque : au fur et à mesure des évolutions des versions d’Oracle, mieux dit de son optimiseur, la différence entre les deux s’efface.

  6. #6
    Membre expérimenté Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Par défaut
    D'un point de vue resultat c'est la même chose (ce qui n'est pas forcément le cas avec NOT IN et NOT EXISTS) par contre d'un point de vue performance ce n'est pas la même chose. L'une ou l'autre solution peut être meilleure selon les cas.

    Tom Kyte en déjà parlé sur son site (faire une recherche sur ASKTOM).

    Pour le IN le CBO traite la sous requête comme une vue en ligne et fait une jointure avec la table maitre.
    Pour le EXISTS la requête est traitée en faisant une boucle sur la table maitre et pour chaque ligne on a un select qui est fait sur la table de la sous requête. Donc on aura autant d'accès à la 2ème table qu'il y'a de lignes dans la 1ère. Sauf bien sûr si une correspondance est trouvée alors on sort de la boucle.

    En règle générale:
    Soit T1 la table de la requête principale et T2 la table de la sous requête.
    Si T2 est volumineuse mais que T1 est petite et qu'on a un index dans T2 sur la colonne de jointure alors la clause EXISTS est plus appropriée.
    Mais si T2 est petite alors la clause IN peut être plus performante.

    Il faut toujours tester les 2 pour être sûr.

    cdmt,
    Ahmed

Discussions similaires

  1. Existe-t-il une différence entre complexité de calcul et complexité d'implémentation?
    Par saou88 dans le forum Algorithmes et structures de données
    Réponses: 24
    Dernier message: 30/10/2012, 14h23
  2. [Joomla!] en 2012, Existe t'il une grande différence entre Joomla et Wordpress ?
    Par whitespirit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 21/02/2012, 16h33
  3. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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