NOT IN & NOT EXISTS

NOT IN & NOT EXISTS - SQL/NoSQL - Programmation

Marsh Posté le 06-06-2008 à 13:32:12    

Bonjour tout le monde,
 
j'ai bien cherche sur le web la difference entre NOT IN et NOT EXISTS mais j'ai un peu de mal a comprendre!!!
que me recommanderz vous utiliser ds une requette du genre :
 
INSERT INTO t1 (champ1, champ2, champ3) SELECT champ1, champ2, champ3 FROM t2 WHERE condition1 AND champ1 NOT IT (SELECT champ1 FROM t1)
 
je sais que vous allez me dire que cette requette est l'equivalent d'un REPLACE mais le probleme est que je n'ai pas de champ unique dans la table t1 puisque c une table relationnelle...
 
une derniere question mais en PHP :)
y a t il une difference entre $valeur = "valeur" et $valeur = 'valeur' ou encore if($valeur == "valeur" ) et if($valeur == 'valeur') ??
 
Merci de votre aide

Reply

Marsh Posté le 06-06-2008 à 13:32:12   

Reply

Marsh Posté le 06-06-2008 à 15:52:41    

Ces deux requêtes sont identiques si ça peut t'aider :
 

Code :
  1. select distinct t1.employe
  2. from employe t1
  3. where t1.employe not in (
  4.      select distinct t2.employe
  5.      from conference t2
  6.      );
  7. select distinct t1.employe
  8. from employe t1
  9. where not exists (
  10.      select *
  11.      from conference t2
  12.      where t1.employe = t2.employe
  13.      );

Reply

Marsh Posté le 06-06-2008 à 16:06:57    

Merci pour ta reponse.
 
Oui je sais qu'elle sont identiques, mais le temps de reponse est apparement different, il parait que NOT EXISTS est plus rapide que NOT IN. mais j'aimerai biena voir confirmation!!

Reply

Marsh Posté le 08-06-2008 à 13:01:11    

not exists ne fait qu'évaluer la condition
 
not in oblige le moteur à aller chercher effectivement les lignes

Reply

Marsh Posté le 08-06-2008 à 18:12:05    

Ca dépend des cas, la réponse que (1) est plus rapide que (2) n'est pas si tranchée.


---------------
La façon qu'il flane, qu'il gambade !
Reply

Marsh Posté le 09-06-2008 à 10:11:01    

HappyHarry a écrit :

not exists ne fait qu'évaluer la condition
not in oblige le moteur à aller chercher effectivement les lignes


Cette explication "généraliste" est vraie mais ces implications dependent des SGBDs et de leur optimiseur.
 
Sur DB2 ( choisi car c'est le SGBD que je pratique le plus), l'optimizer va transformer le not exists en "left outer join + where avec = null".  
Le "not in" lui va être décomposé:

  • construction d'une table temporaire avec le résultat du sous select
  • jointure de la requête principale avec la sous-requête


Selon les circonstances il peut donc être utile d'utiliser l'un ou l'autre.
 


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 09-06-2008 à 11:12:55    

Bonjour, j'espere que vous avez passe un bon week end :)
toutes les docs que g pu consulter favorisent le NOT EXIST car effectivement comme "HappyHarry" l'a dit, il retourne TRUE ou FALSE contraiement au NOT IN qui verifie toute les lignes de la table ce qui peut etre lent...!!
http://www.willasrari.com/blog/tra [...] 00273.aspx
 
et qu'en est il tu IN et EXISTS ??

Reply

Marsh Posté le 09-06-2008 à 11:28:10    

redah75 a écrit :

Et qu'en est il tu IN et EXISTS ??


Sans blaguer tu dis ça pour déconner hein   [:kains]


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 09-06-2008 à 11:43:16    

mais pk deconner??? je ne deconne pas! je confirme que je demande si le EXISTS est plus rapide que IN. qu'est ce qu'il y a de bizarre ds ma question??

Reply

Marsh Posté le 09-06-2008 à 20:11:27    

anapajari a écrit :


Cette explication "généraliste" est vraie mais ces implications dependent des SGBDs et de leur optimiseur.
 
Sur DB2 ( choisi car c'est le SGBD que je pratique le plus), l'optimizer va transformer le not exists en "left outer join + where avec = null".  
Le "not in" lui va être décomposé:

  • construction d'une table temporaire avec le résultat du sous select
  • jointure de la requête principale avec la sous-requête


Selon les circonstances il peut donc être utile d'utiliser l'un ou l'autre.
 


 
c'est vrai, j'ai choisi la version courte, au temps pour moi

Reply

Marsh Posté le 09-06-2008 à 20:11:27   

Reply

Marsh Posté le 09-06-2008 à 20:11:49    

redah75 a écrit :

mais pk deconner??? je ne deconne pas! je confirme que je demande si le EXISTS est plus rapide que IN. qu'est ce qu'il y a de bizarre ds ma question??


 
pas l'impression d'avoir posé une question qui y ressemble fortement un peu plus haut ?

Reply

Marsh Posté le 10-06-2008 à 11:57:51    

j'ai très longtemps cru que NOT IN était *beaucoup* plus lent que NOT EXISTS, surtout sous Oracle (puisque sous Oracle, jusqu'à la 8i, le NOT IN était affreusement lent)
 
c'est maintenant chose révolue.
 
sur la plupart des SGBD, les deux syntaxes sont relativement équivalentes en terme d'exécution, ce qui va donner un temps identique.
 
mais ceci n'est pas toujours vrai, et les deux syntaxes ont leurs avantages et leurs inconvénients.
 
sous oracle, le seul réel intérêt du EXISTS (avoir des conditions multi-critères) s'évanoui avec le "where (champ1, champ2) in (select champ1, champ2 ...)"
 
pour oracle tout du moins, il est dorénavant généralement plus intéressant et plus rapide d'utiliser le IN que le EXISTS.
 
j'ai fais il y a un moment un bench sur le sujet car je n'y croyais pas au départ.
 
à priori, mysql s'en sort aussi mieux avec le IN que le EXISTS
 
SQL Server, ça dépend totallement de la structure de la requête et des index présents, l'un comme l'autre peuvent être catastrophiques ou ultra performants, il faut tester et vérifier le plan d'exécution.

Reply

Marsh Posté le 10-06-2008 à 13:39:06    

HappyHarry a écrit :


 
pas l'impression d'avoir posé une question qui y ressemble fortement un peu plus haut ?


 
j'ai pose cette question car g lu que le comportement du IN n'est pas le meme que NOT IN, meme chose pour EXISTS ET NOT EXISTS, j'avoue que je suis quand meme perdu avec tout ca!!
g hier modifie tout mon code en remplacant les NOT IN par des NOT EXISTS.
 
MagicBuzz : es tu sur que sous mysql NOT IN est mieux et plus rapide que NOT EXISTS???

Reply

Marsh Posté le 10-06-2008 à 16:37:49    

je n'ai jamais utilisé sérieusement MySQL.
 
deplus, le moteur de MySQL évolue énormément d'une version à l'autre (il y a encore 2 ans, les sous-requêtes étaient de la science fiction pour MySQL)
 
donc je ne peux l'affirmer de façon absolue.
en revanche, à l'époque où j'ai constaté que le IN était plus rapide que le EXISTS sous Oracle, c'était suite à une conversation avec une personne qui me soutenait ce constat, se basant notamment sur des résultats de MySQL, donc je me base sur ce témoignage uniquement.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed