NOT IN & NOT EXISTS - SQL/NoSQL - Programmation
Marsh Posté le 06-06-2008 à 15:52:41
Ces deux requêtes sont identiques si ça peut t'aider :
Code :
|
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!!
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
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.
Marsh Posté le 09-06-2008 à 10:11:01
HappyHarry a écrit : not exists ne fait qu'évaluer la condition |
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é:
Selon les circonstances il peut donc être utile d'utiliser l'un ou l'autre.
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 ??
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
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??
Marsh Posté le 09-06-2008 à 20:11:27
anapajari a écrit :
|
c'est vrai, j'ai choisi la version courte, au temps pour moi
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 ?
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.
Marsh Posté le 10-06-2008 à 13:39:06
HappyHarry a écrit : |
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???
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.
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