开发者

SQL SUM Multiple Columns in a table - Performance

Using: SQL Server 2008, Entity Framework

I am summing columns in a table across a date/time range. The table is straight-forward:

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

Once I have the date/time range, I use linq-to-EF to get the query back

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

I then construct my data structure using the sum of the data elements I’m interested in

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

While this works, it results in a lot of DB round trips and is quite slow. Is there a better way to do this? If it means doing it in a stored procedure, that’s fine with me. I just need to get the performance better since we’ll only be adding more measur开发者_如何学JAVAement variables and this performance issue will just get worse.


SQL SERVER is very good at rolling up summary values. Create a proper stored procedure which calculates the sums for you already. This will give you maximum performance, especially if you don't actually need the tabular data in your client program. Just have SQL Server roll up the summary, and send back a whole lot less data. One of the reasons I generally don't like LINQ is because it tempts the programmers to do things like what you are trying to do (pull a set and do 'something' against every row), instead of taking advantage of the database engine and all its capabilities.

Do this with aggregate functions and grouping in the SQL. LINQ will never figure out how to do this fast.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜