2012-02-23 8 views
5

Así que tenemos una consulta simple que se ejecuta con combinaciones a varias tablas y fechamos restringir esta información. Estas consultas forman parte de nuestra carga de almacenamiento de datos y son de tiempo crítico. Notamos una enorme diferencia en las dos velocidades de ejecución y planes de ejecución cuando cambiamos el uso de las fechas en una cláusula where de unirse a una tabla temporal con las fechas en modo:.SQL Query maneja los parámetros de fecha de manera diferente

Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime) 
    Declare @EndDate DateTime = GetDate() 

    Select * 
    From Table A 
      Inner Join Table B 
       On A.A = B.A 
    Where A.Date Between @StartDate AND @EndDate 

Una versión simplificada de la consulta pero devuelve 11k filas en alrededor de 50 segundos.

Declare @StartDate DateTime = Cast(Floor(Cast(GetDate() AS FLOAT))AS DateTime) 
    Declare @EndDate DateTime = GetDate() 

    Select @StartDate StartDate, @EndDate EndDate 
    Into #Dates 

    Select * 
    From Table A 
      Inner Join Table B 
       On A.A = B.A 
      Inner Join #Dates 
       On A.Date Between StartDate AND EndDate 

Devuelve las mismas 11k filas pero sub segundo. La diferencia en el plan de ejecución también es notable, la segunda consulta está llena de bucles anidados en lugar de coincidencias hash en la primera consulta.

Mi pregunta es ¿por qué? ¿Por qué la 50 o más segunda diferencia?

/* * Editar/

Los dos de

1st Query with dates in Where

2nd Query with dates in join

+0

Esto no pretende ser condescendiente, lo siento, solo vale la pena comprobar :) '¿Qué tipo de datos es A. Fecha? ¿Y tiene un índice? ' – MatBailie

+0

Es una fecha y hora, ambos campos en la cláusula where son tipos de fecha y hora. Y sí al índice, DTA no había sugerido ninguna mejora para la consulta – Matt

+0

¿Se pueden publicar ambos QP? –

Respuesta

0

Creo que es cuestión de utilizar funciones en la cláusula DONDE QEP. El problema descrito here

+0

No creo que esto se aplique. ¿Dónde se utilizan las funciones en la cláusula where de los ejemplos de OP? –

3

Creo que lo que te encuentras es un problema de olfateo variable (o la falta de eso). Se explica con extremo detalle en here, pero lo que se reduce a esto es que cuando se usan variables locales, SQL Server no tiene en cuenta sus valores al crear el plan de consulta. Cuando usas una tabla temporal, así es, está generando un plan mucho más eficiente.

Algunas formas de validar esta:

  • intenta convertir esas variables en los parámetros de consulta (o paremeters sproc)
  • Trate de añadir la opción (recompilar) como se menciona en el artículo.

La respuesta a la pregunta (por qué la diferencia de los años 50) es puramente la diferencia entre la eficacia del buen QP frente al malo.

+0

Se está utilizando como una consulta directa, por lo que no le pasamos ningún parámetro simplemente configurando el valor del parámetro. El mismo QP se devuelve al poner los valores de fecha directamente en la cláusula where – Matt

+0

. Lo único que se me ocurre son las estadísticas de la tabla. ¿Los has actualizado? Si están desactualizados, pueden sugerirle otro plan. –

+1

Los he comprobado y actualizado en todas las tablas a las que se hace referencia y siguen siendo los mismos QP y el tiempo de ejecución ...Comportamiento realmente extraño! – Matt