2010-02-12 12 views
11

considere mi consulta sql a continuación; está llamando suma dos veces para el mismo argumento. ES esto duplicando el trabajo hecho por el servidor. ¿Hay una mejor manera de hacer esto?en mi declaración sql Llamo suma dos veces para el mismo argumento, ¿está duplicando el esfuerzo?

SELECT  Status_Detail_Code, count(*) as 
    [Number of times assigned], round(sum(Duration)/60,2) as [total duration Hr] 

FROM   dbo.V_TIMELINE 

WHERE  (CADATE > N'20080101') 

group by Status_Detail_Code order by sum(Duration) desc 

Respuesta

14

No, SQL Server reutiliza los agregados.

De hecho, si se construye el plan de consulta, verá el SUM en un conjunto de resultados de un operador de agregación (como Stream Aggregate) denotado como algo parecido a Expr****.

El valor de esta expresión se usará más adelante como una entrada para los otros operadores.

Aquí está la consulta de ejemplo:

SELECT ROUND(SUM(id), -1) 
FROM master 
GROUP BY 
     name 
ORDER BY 
     SUM(id) DESC 

y que es el plan:

|--Compute Scalar(DEFINE:([Expr1004]=round([Expr1003],(-1)))) 
     |--Sort(ORDER BY:([Expr1003] DESC)) 
      |--Stream Aggregate(GROUP BY:([test].[dbo].[master].[name]) DEFINE:([Expr1003]=SUM([test].[dbo].[master].[id]))) 
       |--Index Scan(OBJECT:([test].[dbo].[master].[ix_name_desc]), ORDERED BACKWARD) 

Como se puede ver, la agregación se realiza una vez y se almacena en Expr1003.

Expr1003 se reutiliza a continuación, tanto en el Sort operador (que procesa la ORDER BY) y Compute Scalar (que procesa ROUND)

Cuestiones relacionadas