Operateur NOT IN marche pas sur des millions d'enregistrements [Résolu]

sihammaster 41 Messages postés samedi 19 juillet 2008Date d'inscription 19 septembre 2013 Dernière intervention - 12 nov. 2012 à 18:09 - Dernière réponse :  mudenstrasse
- 12 févr. 2014 à 11:40
Bonjour,

j'ai 2 tables sql, table_A et table_B dont je voudrais sélectionner les données existent dans table_A et non dans la table table_B,
j'ai utilisé la requête suivantes:

select titre from table_A where titre not in(select titre from table_B)


cette requête a marché bien avant mais maintenant ca retourne 0, meme s'il y'a des données.
je sais pas est ce que ça lié au nombre d'enregistrements parce que mes tables ont passés les 2 millions d'enregistrements,
Merci d’avance.
Afficher la suite 

11 réponses

Répondre au sujet
pmcoste 72 Messages postés mercredi 7 février 2007Date d'inscription 25 juillet 2013 Dernière intervention - 21 nov. 2012 à 20:13
+3
Utile
Non, l'opérateur "not in" n'a pas de limites techniques. Cependant, une requête avec des milliers d'enregistrements mettra ton serveur à genoux car il doit faire un full-scan sur toute la sous-requête, donc c'est très gourmand en ressources. Tout dépend donc de ton serveur (mémoire, etc..) et de son utilisation.
Préfères donc ma méthode car elle utilise les index donc tu auras un temps de réponse divisé par 10, ce qui est préférable pour tout le monde (serveur, client, etc..).



-------------------
Oderint dum metuant
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de pmcoste
cs_Malkuth 278 Messages postés samedi 22 février 2003Date d'inscription 24 avril 2013 Dernière intervention - 21 nov. 2012 à 20:22
+3
Utile
normalement, not in est vu exactement comme une jointure par l'interpreteur SQL donc il prend en compte les index de la même manière, lá le probléme n'est pas tant que la requtte soit longue, c'est quel ne renvoie rien et ca je ne comprend vraiment pas pourquoi.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Malkuth
pmcoste 72 Messages postés mercredi 7 février 2007Date d'inscription 25 juillet 2013 Dernière intervention - 14 nov. 2012 à 11:35
0
Utile
Bonjour,

Ta requête va être trop longue à exécuter, il vaut mieux passer par une jointure externe :

Select A.titre
From   table_A as A
    Left Join table_B as B on A.titre=B.titre
Where B.titre Is NULL




-------------------
Oderint dum metuant
Commenter la réponse de pmcoste
cs_Malkuth 278 Messages postés samedi 22 février 2003Date d'inscription 24 avril 2013 Dernière intervention - 18 nov. 2012 à 20:49
0
Utile
tu as des index sur les tables?
Commenter la réponse de cs_Malkuth
sihammaster 41 Messages postés samedi 19 juillet 2008Date d'inscription 19 septembre 2013 Dernière intervention - 19 nov. 2012 à 10:35
0
Utile
Oui mes tables sont indexées.
Commenter la réponse de sihammaster
cs_Malkuth 278 Messages postés samedi 22 février 2003Date d'inscription 24 avril 2013 Dernière intervention - 19 nov. 2012 à 10:42
0
Utile
je ne vois pas ce qui coince, tu es sur quel base de donnée?
Commenter la réponse de cs_Malkuth
sihammaster 41 Messages postés samedi 19 juillet 2008Date d'inscription 19 septembre 2013 Dernière intervention - 19 nov. 2012 à 18:26
0
Utile
SQL Server 2008.
Commenter la réponse de sihammaster
pmcoste 72 Messages postés mercredi 7 février 2007Date d'inscription 25 juillet 2013 Dernière intervention - 21 nov. 2012 à 15:55
0
Utile
Bonjour,

As-tu essayé la requête que je t'ai envoyé ?
Il faut de plus que tu aies un index sur les champs "titre" de tes 2 tables afin que cette requête soit la plus rapide possible
Select A.titre
From   table_A as A
    Left Join table_B as B on A.titre=B.titre
Where B.titre Is NULL




-------------------
Oderint dum metuant
Commenter la réponse de pmcoste
sihammaster 41 Messages postés samedi 19 juillet 2008Date d'inscription 19 septembre 2013 Dernière intervention - 21 nov. 2012 à 18:34
0
Utile
Bonjour,
Oui j'ai testé ta requête marche bien sans problèmes, mais j'ai utilisé NOT IN dans plusieurs projets et je voudrais savoir est ce que si possible de trouver une solution pour prendre une décision a cesser d'utiliser l’opérateur NOT IN et le modifier dans tous les projets une fois pour toute, et avant de prendre cette décision, je voulais savoir avant est ce qu'il ya des limitations; que NOT IN ne fonctionne pas si on a des milliers des enregistrements?
Merci.
Commenter la réponse de sihammaster
sihammaster 41 Messages postés samedi 19 juillet 2008Date d'inscription 19 septembre 2013 Dernière intervention - 22 nov. 2012 à 10:58
0
Utile
Bonjour,
Merci bcp Malkuth et pmcoste pour vos réponses. il m'apparait de laisser NOT IN tranquille et utiliser la requête de pmcoste ,
Merci encore.
Commenter la réponse de sihammaster
mudenstrasse - 12 févr. 2014 à 11:40
0
Utile
Cela est surement du au fait que la sous requête retourne au moins un NULL. Dans ce cas la requête ne renvoie rien.
Commenter la réponse de mudenstrasse

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.