2010-02-01 17 views
6

Dada la instrucción SQL:SQL Server 'En' Declaración Artículo de la orden para el funcionamiento

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

Si puedo garantizar que la mayoría de las filas de MY_TABLE tiene SomeNumberField conjunto a 99999, y puede proyectar que esta seguirá siendo la indefinately caso, es mejor escribir la consulta anterior como esto:

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

Respuesta

4

Si usted tiene un índice en SomeNumberField, a continuación, esta declaración será o bien simplemente dividir en dos escaneos de rango en el índice, o procesados ​​como TABLE SCAN/CLUSTERED INDEX SCAN con una filtrar.

El último es más probable, siempre que la mayoría de sus filas tiene SomeNumberField = 999999

Los escaneos de rango siempre se realizan en el orden de índice, independientemente de las constantes de la orden en los IN predicado.

El tiempo de comparación del filtro es insignificante en comparación con el tiempo requerido para recuperar las páginas de datos.

1

este tipo de optimización puede hacerse automáticamente por el optimizador de SQL siempre que reúna algunas estadísticas que son utilizados por el optimizador. Puede usar herramientas proporcionadas por el proveedor de la base de datos para esta tarea. Para el servidor SQL consulte el artículo siguiente en MSDN: http://msdn.microsoft.com/en-us/library/cc966419.aspx

Cuestiones relacionadas