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
Esto no pretende ser condescendiente, lo siento, solo vale la pena comprobar :) '¿Qué tipo de datos es A. Fecha? ¿Y tiene un índice? ' – MatBailie
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
¿Se pueden publicar ambos QP? –