2011-02-01 34 views
0

使用:SQL Server 2008中,實體框架表中的SQL SUM多列 - 性能

我在一個表中某一日期/時間範圍求和列。該表是直接的:

DataId bigint IDENTITY(1,1) NOT NULL PRIMARY KEY, 
DateCollected datetime NOT NULL, 
Length int NULL, 
Width int NULL, 
-- etc... (several more measurement variables) 

一旦我有日期/時間範圍,我使用LINQ到EF得到查詢回來

var query = _context.Data.Where(d => 
           (d.DateCollected > df && 
           d.DateCollected < dt)) 

我然後使用構造我的數據結構在

DataRowSum row = new DataRowSum 
{ 
    Length_Sum = query.Sum(d => d.Length.HasValue ? (long)d.Length.Value : 0), 
    Width_Sum = query.Sum(d => d.Width.HasValue ? (long)d.Width.Value : 0), 
    // etc... (sum up the rest of the measurement variables) 
} 

的數據元素我感興趣的總和雖然這個工作,它會導致很多DB往返,是相當緩慢的。有一個更好的方法嗎?如果它意味着在存儲過程中執行它,那對我來說沒問題。我只需要獲得更好的性能,因爲我們只會添加更多的測量變量,並且性能問題會變得更糟。

回答

2

SQL SERVER非常擅長彙總彙總值。創建一個適當的存儲過程,爲您計算總和。這將爲您提供最佳性能,尤其是如果您實際上不需要客戶端程序中的表格數據。只需要SQL Server彙總摘要,併發回少量的數據。我一般不喜歡LINQ的原因之一是因爲它誘使程序員做你想做的事情(拉一個集合,對每一行做'某事'),而不是利用數據庫引擎和所有功能。

在SQL中使用聚合函數和分組來做到這一點。 LINQ永遠不會知道如何快速做到這一點。

+0

謝謝@Jasmine。我猜測SP路線是最好的選擇。 SQL中的分組是如何進入混合的? – 2011-02-01 20:23:22