Je me suis retrouvé dans un vrai pétrin. J'ai des tables d'une seule colonne (listes de supression ou d'inclusion) qui sont plus ou moins varchar (25) mais le fait est que je n'aurai pas le temps de les indexer avant de les utiliser dans la requête principale. Je ne saurai pas combien de lignes sont dans chaque table. La table de base au cœur de tout cela est d'environ 1,4 million de lignes et quelque 50 colonnes.L'ancien joint IN vs Exists vs Left (où ___ est ou n'est pas nul); Performance
Mes hypothèses sont les suivantes:
EN shouln't être utilisé dans les cas avec beaucoup de valeurs (lignes) sont retournés, car il semble bien que les valeurs en série, non? (IN sur un sous-requête pas passé directement les valeurs)
Rejoint (INNER pour l'inclusion et à gauche et la vérification des valeurs NULL lorsque supression) sont les meilleurs pour les grands ensembles de données (plus de 1k lignes ou pour ainsi mach à)
EXISTS m'a toujours préoccupé parce qu'il semble faire une sous-requête pour chaque ligne (tous les 1,4 millions de Yikes.)
Mon instinct dire, si possible obtenir le compte de la table de suppression et utiliser soit IN (pour sub 1k rows) et INNER/LEFT Join (pour les tables de suppression au-dessus de 1k lignes) Note, et le champ que je supprimerai sera index dans la grande table de base mais la table de suppression ne le sera pas. Pensées?
Merci d'avance pour tous les commentaires et/ou des conseils.
+1 Un bon lien avec de bonnes métriques pour soutenir la conclusion. – Thomas
@Thomas: thx, me rappelle de pousser Quassnoi à adresser ce qui est mieux quand les colonnes peuvent être nulles ... –