2010-01-20 15 views
7

Digamos por ejemplo que estoy uniendo en una tabla de números para realizar alguna operación entre dos fechas en una subconsulta, así:¿Cómo impacta Dateadd el rendimiento de una consulta SQL?

select n 
     ,(select avg(col1) 
      from table1 
     where timestamp between dateadd(minute, 15*n, @ArbitraryDate) 
          and dateadd(minute, 15*(n+1), @ArbitraryDate)) 
    from numbers 
where n < 1200 

¿Sería la consulta funcionará mejor si yo, por ejemplo, construida a partir de la fecha varchars concatenación que usar la función dateadd?

+0

n es un campo int (o smallint, lo que sea) en la tabla 1? –

+0

@Patrick Karcher, n es un int de la tabla [número]. – Daniel

+0

Puede que necesite mostrarnos la estructura de table1 – HLGEM

Respuesta

4

de datos teniendo en el formato de fecha y hora utilizando DATEADD es más probable que sea más rápido esta pregunta

Comprobar: (no yo) Most efficient way in SQL Server to get date from date+time?

La respuesta aceptada demuestra DATEADD sobre la conversión de series. He visto otro hace muchos años que mostró el mismo

+0

Ese es exactamente el tipo de respuesta que estaba esperando. +1 a usted por encontrarlo y +1 a Tomás por el gran punto de referencia. ¡Gracias! – Daniel

3

NO iría con varcars concatenantes.

DateAdd será mejor que la contaminación de cadenas y se lanzará a DATETIME.

Como siempre, lo mejor es apostar por las 2 opciones y determinar el mejor resultado, ya que no se especifica ninguna base de datos.

+0

¿Cuál es el motivo de esto? – Daniel

4

que tener cuidado con el medio y fechas, echar un vistazo a How Does Between Work With Dates In SQL Server?

Una vez optmized una consulta a correr desde más de 24 horas a 36 segundos. Simplemente no use funciones de fecha o conversiones en la columna, consulte aquí: Only In A Database Can You Get 1000% + Improvement By Changing A Few Lines Of Code

para ver qué consulta funciona mejor, ejecutar ambas consultas y mirar los planes de ejecución, también puede usar estadísticas io y tiempo de estadísticas para obtener cuántos lee y el tiempo necesario para ejecutar las consultas

+0

Gracias por el aviso en "entre". Veo que tendré cierta superposición. – Daniel

2

Siempre que los cálculos de sus predicados no incluyan referencias a las columnas de la tabla que está consultando, su enfoque no debería importar de ninguna manera (para mayor claridad).

Si tuviera que incluir algo de Table1 en el cálculo, me gustaría tener en cuenta los escaneos de tablas o los escaneos de índice, ya que puede que ya no sea sargable.

En cualquier caso, verifique (o publique) el execution plan para confirmar.

2

¿Para qué utilizar una subconsulta correlacionada para empezar? Eso te retrasará mucho más que dateadd. Son como cursores, funcionan fila por fila. ¿Funcionará algo como esto?

select n.n , avgcol1 
    from numbers n 
    left outer join 
     (
     select avg(col1) as avgcol1, n 
     from table1 
     where timestamp between dateadd(minute, 15*n, @ArbitraryDate) 
      and dateadd(minute, 15*(n+1), @ArbitraryDate) 
     Group by n 
     ) t 
    on n.n = t.n 
    where n < 1200 
+0

Esa es una buena idea. El problema es que table1 no está enumerado (o necesariamente enumerable). – Daniel

+0

Me estoy pateando a mí mismo por no ver eso. Muy buen punto. –

+0

Reemplacé la unión interna con la izquierda externa, de modo que esta consulta es equivalente a la original. –

3

lo más probable es que no haya diferencia alguna de una manera u otra. Me ejecutar este:

SET STATISTICS IO ON; 
SET STATISTICS TIME ON; 

seguido de las dos variantes de la consulta, por lo que se ve y comparar los costos de ejecución reales.

+0

Gracias por este práctico consejo – Daniel

Cuestiones relacionadas