2011-02-01 6 views
0

Использование: SQL Server 2008, Entity FrameworkSQL 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-to-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? –

+0

Совокупные функции, такие как min() и sum(), работают против групп строк. Группой может быть «все строки», или вы можете разбить ее на более мелкие группы. Например, скажем, у вас в таблице есть таблица с заказами клиентов - вы можете узнать количество заказов для каждого клиента с помощью select cust_id, count (1) из группы заказов cust_id - рассказать вам количество строк, сгруппированных по клиенту , Вы можете выполнить групповой/агрегирующий запрос с LINQ, но он не такой надежный, как реализация T-SQL. – Jasmine

Смежные вопросы