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

Signaler
Messages postés
41
Date d'inscription
samedi 19 juillet 2008
Statut
Membre
Dernière intervention
19 septembre 2013
-
 mudenstrasse -
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.

11 réponses

Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
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
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
2
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.
Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
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
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
2
tu as des index sur les tables?
Messages postés
41
Date d'inscription
samedi 19 juillet 2008
Statut
Membre
Dernière intervention
19 septembre 2013

Oui mes tables sont indexées.
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
2
je ne vois pas ce qui coince, tu es sur quel base de donnée?
Messages postés
41
Date d'inscription
samedi 19 juillet 2008
Statut
Membre
Dernière intervention
19 septembre 2013

SQL Server 2008.
Messages postés
72
Date d'inscription
mercredi 7 février 2007
Statut
Membre
Dernière intervention
25 juillet 2013
1
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
Messages postés
41
Date d'inscription
samedi 19 juillet 2008
Statut
Membre
Dernière intervention
19 septembre 2013

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.
Messages postés
41
Date d'inscription
samedi 19 juillet 2008
Statut
Membre
Dernière intervention
19 septembre 2013

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