2010-08-30 6 views
2

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.

Répondre

6

En supposant que TSQL signifie SQL Server, have you seen this link regarding a comparison of NOT IN, NOT EXISTS, and LEFT JOIN IS NULL? En résumé, tant que les colonnes comparées ne peut pas être NULL, NOT IN et NOT EXISTS sont plus efficaces que LEFT JOIN/IS NULL ...

Quelque chose à garder à l'esprit la différence entre IN et EXISTS - EXISTE est un opérateur booléen, et renvoie true la première fois que le critère est satisfait. Bien que vous voyez une sous-requête corrélée dans la syntaxe, EXISTS a effectué mieux que IN ...

En outre, IN et EXISTS vérifient uniquement l'existence de la comparaison de valeurs. Cela signifie qu'il n'y a pas de duplication des enregistrements comme vous trouvez lors de l'assemblage ...

Cela dépend vraiment, donc si vous êtes vraiment dehors pour trouver ce qui fonctionne le mieux, vous devrez tester & comparer ce que font les plans de requête. ..

+0

+1 Un bon lien avec de bonnes métriques pour soutenir la conclusion. – Thomas

+0

@Thomas: thx, me rappelle de pousser Quassnoi à adresser ce qui est mieux quand les colonnes peuvent être nulles ... –

0

Peu importe la technique utilisée, s'il n'y a pas d'index sur la table sur laquelle vous appliquez un filtre ou une jointure, le système effectuera une analyse de table.

RE: Exists

Il est pas nécessairement le cas que le système fera une sous-requête pour tous les 1,4 million de lignes. SQL Server est assez intelligent pour exécuter la requête interne Exists, puis l'évaluer par rapport à la requête principale. Dans certains cas, Exists peut être égal ou supérieur à une jointure.