2009-12-09 55 views
0

我有一個簡單的數據記錄表,其中有兩個數據列A和B,我想要爲其生成A + B的總和。然而,A和B中的任一個或兩者都可以爲空。該表還具有一個時間戳列是主鍵T-SQL查詢計劃幫助選擇最佳形式的查詢?

我可以看到幾種方法對皮膚這隻貓,但我很好奇,想知道什麼是首選的方法可能是在一定範圍的時間戳的總結數據:

1. SUM(Coalesce(A,0)+Coalesce(B,0)) 

2. SUM(Coalesce(A+B,A,B,0)) 

3. Coalesce(Sum(A), 0) + Coalesce(SUM(B), 0) 

我從執行計劃的結果如下:

 
Form Select Compute Scalar Stream Aggregate Compute Scaler Clustered Index Seek 
    1  0%   0%    11%    1%     87%  
    2  0%   0%    11%    1%     87%  

Form Select Compute Scalar Compute Scaler Stream Aggregate Clustered Index Seek 
    3  0%   0%    0%    12%     88%  

我從來沒有鑽研的查詢計劃中非常重要之前,所以我不知道如何解釋數字。公平地說,一般來說,越是推到右邊,整體百分比就會偏離那麼就越好。讓Form 3優於1和2?

回答

2

針對預期情況進行優化。

這裏,如果A和B都大部分時間都有值,那麼#2應該會​​做得更好,因爲聚結會達到第一個值並停止。如果A或B非常頻繁,你可以用#1做得更好一些。與往常一樣,這裏的關鍵是嘗試兩種方式並在實際數據上分析實際時間。

+0

好的我可以理解,但是我的查詢計劃結果告訴我,它們是由相同的數據運行的? – 2009-12-09 00:52:09

+1

這些_expected_計劃是爲查詢引擎_before_實際開始運行查詢而使用而生成的。他們告訴你SQL Server如何執行你的查詢,但不要考慮實際時間。您需要查看實際的執行時間。在其他安靜的服務器上執行此操作,並多次執行以獲得平均值。 – 2009-12-09 00:54:18

+0

@Joel ..所以基本上你告訴我看着這個執行計劃並不是非常有用,唯一真正有意義的決定可以通過在安靜的服務器上對真實世界數據運行查詢來獲得?這對我來說似乎有點不誠實。 – 2009-12-09 01:42:28