2013-07-24 4 views
1

Je suis en train de refactoriser un ancien code SQL de collègues et j'ai remarqué dans quelques endroits une clause where du formulaire where [SomeCol] in ('XYZ'). Je suppose que c'est juste un résultat de copier-coller rapide d'autres endroits dans le code avec plus de valeurs dans les crochets (where [SomeCol] in ('ABC', 'DEF', 'XYZ')) et les remplacer par [SomeCol] = 'XYZ', même si ce n'est que pour des raisons de propreté.Toute différence entre [col] dans ('élément unique') et [col] = 'élément unique'?

Je voulais juste être absolument sûr que les deux déclarations sont fonctionnellement équivilentes - je suppose que [SomeCol] = 'XYZ' est un peu (probablement unoticably) plus efficace, mais ne veulent pas savoir plus tard je trébuche sur certains obscurs fonctionnalité qui produira des résultats différents.

+1

Jetez un coup d'œil au plan d'exécution. Pour mes exemples, c'est la même chose. – makciook

+1

Ils sont équivalents dans tous les sens. Pas de différence de résultats et pas de différence de performance non plus. Si vous vérifiez le plan d'exécution, vous verrez que votre '[SomeCol] dans ('XYZ')' est exécuté comme '[SomeCol] = 'XYZ'' donc vous ne ferez aucune différence en le changeant. –

+2

@Kai. . . La seule différence est la maintenabilité. Si vous ajoutez et supprimez des valeurs, le formulaire 'in' est plus sûr. Vous n'avez pas à vous soucier de quelqu'un qui change 'x = 'a' et y = 'c'' 'x = 'a' ou x = 'b' et y = 'c''. –

Répondre

3

Elles doivent être identiques sur le plan opérationnel. J'ai parfois fait l'IN lorsque j'avais une valeur unique au départ mais je soupçonnais que dans le futur d'autres valeurs pourraient être requises. Cela facilite l'ajout de nouvelles valeurs sans modifier la structure de l'instruction. Juste une supposition au "pourquoi".

1

Ils sont équivalents.

Pour les valeurs inférieures à 63 dans la liste IN, SQL Server étend la liste d'entrée à plusieurs OR. Par exemple,

[SomeCol] IN (1,2,3,4) 

sera evaulated comme

([SomeCol]=1 or [SomeCol]=2 or [SomeCol]=3 or [SomeCol]=4) 

Par conséquent, dans ce cas, il n'y aurait pas d'où ORs les deux sont équivalents.

+2

Est-ce que vous vous souvenez d'où vous avez obtenu cette information? Je serais très intéressé par les articles sur le fonctionnement interne de l'optimiseur de requêtes MSSQL, donc s'il s'agit d'une source publique PLEASE partager le lien :-) –

+0

@PaulGroke - Je ne suis pas sûr qu'il soit documenté n'importe où. Mais il est évident que quelque chose de ce genre se passe si vous avez mal orthographié 'SomeCol' - vous aurez un message d'erreur par élément dans' IN' –

+0

@Damien_The_Unbeliever - Je suis à peu près sûr que c'est un artefact de l'analyseur et ne dit rien de ce que l'optimiseur de requêtes aurait fait avec la requête si elle l'avait jamais vu. –

Questions connexes