2010-02-01 8 views
6

Étant donné l'instruction SQL:SQL Server « Dans » Déclaration Point ordonnance d'exécution

SELECT * 
FROM MY_TABLE 
WHERE SomeNumberField in (0,99999) 

Si je peux vous garantir que la majorité des lignes de MY_TABLE ont SomeNumberField ensemble à 99999, et peut projeter que cela restera le cas indefinately, est-il préférable d'écrire la requête ci-dessus comme ceci:

SELECT * 
FROM MY_TABLE 
WHERE SomeNumberField in (99999,0) 

Répondre

4

Si vous avez un index sur SomeNumberField, cette déclaration sera soit juste divisé en deux scans de plage sur l'indice, ou traité comme un TABLE SCAN/CLUSTERED INDEX SCAN avec filtre.

Ce dernier est plus probable, à condition que la majorité de vos lignes ont SomeNumberField = 999999

Les scans de gamme seront toujours effectuées dans l'ordre d'index, quelles que soient les constantes ordre dans le prédicat IN.

Le temps de comparaison du filtre est négligeable par rapport au temps requis pour aller chercher les pages de données.

1

ce type d'optimisation peut être effectuée automatiquement par l'optimiseur SQL à condition que vous rassemblez des statistiques utilisées par l'optimiseur. Vous pouvez utiliser les outils fournis par le fournisseur de la base de données pour cette tâche. Pour le serveur SQL reportez-vous à l'article suivant sur MSDN: http://msdn.microsoft.com/en-us/library/cc966419.aspx