Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
966 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  NOT IN & NOT EXISTS

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

NOT IN & NOT EXISTS

n°1742486
redah75
Posté le 06-06-2008 à 13:32:12  profilanswer
 

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

mood
Publicité
Posté le 06-06-2008 à 13:32:12  profilanswer
 

n°1742559
wsamps
Posté le 06-06-2008 à 15:52:41  profilanswer
 

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.      );

n°1742583
redah75
Posté le 06-06-2008 à 16:06:57  profilanswer
 

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!!

n°1743115
HappyHarry
Posté le 08-06-2008 à 13:01:11  profilanswer
 

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

n°1743184
soldierbra​nd
De haute gamme
Posté le 08-06-2008 à 18:12:05  profilanswer
 

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 !
n°1743352
anapajari
s/travail/glanding on hfr/gs;
Posté le 09-06-2008 à 10:11:01  profilanswer
 

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.
n°1743387
redah75
Posté le 09-06-2008 à 11:12:55  profilanswer
 

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 ??

n°1743391
anapajari
s/travail/glanding on hfr/gs;
Posté le 09-06-2008 à 11:28:10  profilanswer
 

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.
n°1743396
redah75
Posté le 09-06-2008 à 11:43:16  profilanswer
 

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??

n°1743690
HappyHarry
Posté le 09-06-2008 à 20:11:27  profilanswer
 

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

mood
Publicité
Posté le 09-06-2008 à 20:11:27  profilanswer
 

n°1743691
HappyHarry
Posté le 09-06-2008 à 20:11:49  profilanswer
 

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 ?

n°1744119
MagicBuzz
Posté le 10-06-2008 à 11:57:51  profilanswer
 

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.

n°1744177
redah75
Posté le 10-06-2008 à 13:39:06  profilanswer
 

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???

n°1744303
MagicBuzz
Posté le 10-06-2008 à 16:37:49  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  NOT IN & NOT EXISTS

 

Sujets relatifs
[RESOLU] probleme file.exists()utilisation de NOT en VBA
In love des listes déroulantesWHERE NOT EXISTS.... huh ???
NOT IN[MySQL] pb avec une requête et EXISTS
Problème avec fonction IF NOT EXIST[mysql] NOT EXISTS
Plus de sujets relatifs à : NOT IN & NOT EXISTS


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR