2011-11-14 5 views
7

Estoy usando SQL Server 2008. Tengo un índice Non-Unique Non-cluster en una columna DateTime "DateFrom". Estoy buscando en la tabla basada en esta columna. Sólo quería saber el efecto de CONVERT() la función de ÍNDICE ver más abajo:¿Cuál es el efecto de CONVERTIR() en ÍNDICE durante la búsqueda?

Query1: 
SELECT * 
FROM myTable 
WHERE CONVERT(VARCHAR(10),DateFrom,23) >= '2011-01-01' 

Query2: 
SELECT * 
FROM myTable 
WHERE DateFrom >= '2011-01-01 00:00:00.000' 

He comprobado & no encontraron diferencias. Pero estaba pensando que dado que la columna está CONVERTIDA, entonces el índice no puede ser utilizado por el servidor SQL, ¿es correcto?

Por favor, perdóneme, si esta no es una pregunta adecuada.

+0

o.DateFrom - no hay un alias para o - ligero error ortográfico? – Andrew

+0

* He comprobado y no encontré ninguna diferencia * - ¿Dice que realmente comparó los planes de ejecución y los encontró idénticos? Dudo que; la primera consulta compara cadenas usando reglas para cadenas, la segunda compara fechas. – GSerg

+0

Si está en 2008 y lanza 'datetime' a' date', aún puede usar un índice, pero esta es una excepción a la regla. –

Respuesta

10

Generalmente, cuando tiene una función en el lado izquierdo de la comparación en una cláusula WHERE, el servidor no podrá utilizar el índice en la columna a la que se hace referencia.

En su primer ejemplo, no hay ninguna comparación directa con la columna DateFrom. En cambio, estás usando una función en la columna. Cuando el servidor expande esto, debe realizar la función en cada valor de columna, y el valor resultante no se indexa. Por lo tanto, no se puede usar ningún índice para mejorar la consulta.

Además, en su primer ejemplo, indicó que la columna DateFrom es una columna de fecha y hora. Sin embargo, está convirtiendo la columna en una cadena y haciendo una comparación de cadenas. Por lo tanto, el servidor no usará su índice de fecha y hora.

En el segundo ejemplo, está comparando directamente el valor constante con la columna de fecha, por lo que el servidor puede utilizar el índice. El servidor convertirá la constante de cadena en el lado derecho de la comparación en un valor de fecha y hora. Sin embargo, no usará el índice en todos los casos. Por ejemplo, si tiene pocas filas, el servidor puede decidir no usar el índice y escanear las pocas filas.

Ambas consultas pueden arrojar el mismo conjunto de resultados, pero siguen siendo muy diferentes.

+0

Gracias, déjame probarlo en datos de gran tamaño. –

Cuestiones relacionadas