2011-06-02 11 views
6

El gasto está utilizando la función DateAdd no solo en SELECT, sino también en WHERE; O usando la Sub Consulta que inicialmente devuelve más datos de los que necesito, pero luego se puede filtrar sin usar la función DateAdd nuevamente en la base de datos.Eficiencia SQL - Consulta utilizando la función fechaAdd dos veces; o SubQuery y DateAdd Function una vez; en la fecha ENTRE

El plan de ejecución parece implicar que son idénticos en lo que a ella respecta. Me pregunto, ¿cuál sería más eficiente?

DECLARE @DateFrom DateTime 
    SET @DateFrom = '2011-05-27' 
    DECLARE @DateTo DateTime 
    SET @DateTo = '2011-06-27' 

    SELECT id, name, 
    dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset 
      dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx 
    FROM tablename 
    WHERE dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset 
      dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) 
      BETWEEN @DateFrom AND @DateTo 

    ORDER BY itsm_requiredbyx desc 

    --------------------------------------------------------------------------------------------- 

    SELECT * 
    FROM 
     (
     select id, name, 
     dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset 
       dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx 
     from tablename 
     ) RR 
    WHERE itsm_requiredbyx BETWEEN @DateFrom AND @DateTo 
    ORDER BY itsm_requiredbyx desc 
+4

No creo que importe. Pero ve que está haciendo cálculos para el campo 'itsm_requiredbyx' y luego verifica si el resultado está entre dos valores externos,' @ DateFrom' y '@ DateTo'.Si no hace ningún cálculo en el campo, pero realiza los cálculos (invertidos) a los valores externos en su lugar y luego verifica si 'itsm_requiredbyx' está entre estos dos valores calculados, la consulta puede usar el índice de' itsm_requiredbyx'. –

+0

Sintaxis corregida, gracias. –

+0

Hay configuraciones regionales con un desplazamiento de UTC que no es un número entero de horas. Como pareces estar tratando de escribir un código internacional, es posible que tengas que ser consciente de eso. –

Respuesta

7

No creo que importe cuál de las dos utiliza. Y los planes de ejecución están de acuerdo.

Pero parece que está haciendo cálculos en la columna itsm_requiredbyx y luego verifica si el resultado está entre dos valores externos, @DateFrom y @DateTo. De esta forma, todas las fechas de este campo son procesadas por las funciones antes de que se puedan aplicar las condiciones WHERE y no se pueda usar ningún índice. El segundo enlace (Ten Common SQL Programming Mistakes) en la respuesta de @ DOK proporciona información más detallada sobre por qué y cuándo sucede esto.

Si usted no hace ningún cálculo a la columna, pero lo hace los cálculos (invertido) de los valores externos en vez y luego comprobar si itsm_requiredbyx es entre estos dos valores calculados, la consulta puede utilizar un índice de itsm_requiredbyx (y las funciones solo se llamarán dos veces y no para cada fila en la tabla).

1

This article Lo podría ayudar a elegir. Si sus columnas de fecha están indexadas, puede haber una gran diferencia entre los métodos utilizados, particularmente en la WHERE cláusula.

Como se dice,

Si estás buscando tablas de gran tamaño con una gran cantidad de registros, lo más probable es índice de algunas de las columnas de fecha que se utilizan comúnmente para limitar las consultas. Cuando se usa una columna de fecha en una cláusula WHERE, el optimizador de consultas no usará un índice si la columna de fecha está envuelta en una función.

Esto se explica también en Ten Common SQL Programming Mistakes, en particular bajo # 2 Funciones en columnas indexadas en predicados:

El problema surge del hecho de que las columnas de índice se están pasando a una función, que el motor de consulta debe evaluar entonces para cada fila en la tabla. En casos como estos, el predicado de la cláusula WHERE es considerado "no-SARGable" y el mejor que el optimizador de consultas puede hacer es realizar un análisis completo de índice o tabla.

Para asegurarse de que los índices se utilizan, debemos evitar el uso de funciones en columnas indexadas.

Cuestiones relacionadas