2010-02-12 7 views
11

rozważ moje zapytanie sql poniżej; Wywołuje sumę dwukrotnie dla tego samego argumentu. TO to powiela pracę wykonaną przez serwer. Czy jest lepszy sposób to zrobić?w moim słowie sql Wywołuję sumę dwukrotnie dla tego samego argumentu, czy to duplikuje nakład?

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 

Odpowiedz

14

Nie, SQL Server ponownie wykorzystuje dane zagregowane.

W rzeczywistości, jeśli zbudujesz plan zapytania, zobaczysz SUM w zestawie wyników operatora agregującego (jak Stream Aggregate) oznaczonego jako coś takiego jak Expr****.

Wartość tego wyrażenia zostanie później wykorzystana jako dane wejściowe dla innych operatorów.

Oto przykładowe zapytanie:

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

i jego planu:

|--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) 

Jak widać, agregacja odbywa się raz i przechowywane w Expr1003.

Expr1003 następnie ponownie użyty w zarówno dla operatora Sort (który przetwarza ORDER BY) i Compute Scalar (który przetwarza ROUND)

Powiązane problemy