SQL SUMNT несколько столбцов в таблице - производительность - PullRequest
0 голосов
/ 01 февраля 2011

Использование : SQL Server 2008, Entity Framework

Я суммирую столбцы в таблице в диапазоне дат / времени. Стол прост:

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

Хотя это работает, это приводит к большому количеству обращений к БД и является довольно медленным. Есть лучший способ сделать это? Если это означает делать это в хранимой процедуре, это нормально для меня. Мне просто нужно улучшить производительность, так как мы только добавим больше переменных измерения, и эта проблема производительности только ухудшится.

1 Ответ

2 голосов
/ 01 февраля 2011

SQL SERVER отлично справляется со сводными значениями. Создайте правильную хранимую процедуру, которая уже рассчитывает суммы для вас. Это даст вам максимальную производительность, особенно если вам на самом деле не нужны табличные данные в вашей клиентской программе. Просто сделайте так, чтобы SQL Server свернул сводку и отправил обратно намного меньше данных. Одна из причин, по которой я обычно не люблю LINQ, заключается в том, что он склоняет программистов делать то, что вы пытаетесь делать (тянуть набор и делать «что-то» против каждой строки), вместо того, чтобы использовать преимущества механизма базы данных и все его возможности.

Делайте это с агрегатными функциями и группировкой в ​​SQL. LINQ никогда не поймет, как это сделать быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...