LINQ быстрее в списке или таблице? - PullRequest
1 голос
/ 03 марта 2011

У меня много запросов, и мне было интересно, есть ли существенная разница в производительности между запросами List и DataTable или даже индексированной таблицы SQL-сервера? Или, может быть, будет быстрее, если я пойду с другим типом коллекции?

В общем, что ты думаешь?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 03 марта 2011

Это почти всегда должно быть быстрее, если запрашивать что-нибудь в памяти, как List<T> или DataTable по отношению к базе данных.

Сказав это, вы должны поместить данные в объект в памяти, например, в List, прежде чем их можно будет запрашивать, поэтому я, конечно, надеюсь, что вы не думаете о том, чтобы сбросить вашу БД в List<T> для быстрого запроса. Это была бы очень плохая идея.

Я понял ваш вопрос?

2 голосов
/ 03 марта 2011

Возможно, вы путаете Linq с языком запросов к базе данных.Я бы посоветовал прочесть о Linq, в частности IQueryable vs IEnumerable .

Короче говоря, Linq - это язык запросов в коде, который может указывать практически на любой набор данных для выполнения поиска.проекции, агрегаты и т. д. аналогично моде как SQL, но не ограничиваются RDBMS.На первый взгляд, это не язык запросов к БД, такой как SQL;его можно просто перевести в единицу с помощью поставщика IQueryable, строки Linq2SQL, Linq2Azure, Linq для сущностей ... список можно продолжить.

Сторона IEnumerable в Linn, которая работает с объектами в памяти, которыеуже находятся в куче, почти наверняка будут работать лучше, чем сторона IQueryable, которая существует для перевода на собственный язык запросов, такой как SQL.Однако это не из-за слабости или силы, присущей какой-либо из сторон языка.Вместо этого (обычно) необходимо посылать переведенную команду IQueryable по сетевому каналу и получать результаты по тому же принципу, которые будут работать намного медленнее, чем память вашего локального компьютера.

Однако «тяжелая работа» по извлечению записей из хранилища данных и созданию представлений объектов в памяти должна быть выполнена в какое-то время, и IQueryable Linq почти наверняка будет быстрее, чем создание ВСЕХ записей, как в-памяти памяти, ТО, используя IEnumerable Linq (Linq 2 Objects) для фильтрации, чтобы получить ваши фактические данные.

Для иллюстрации: у вас есть таблица MyTable;он содержит относительно скромные 200 миллионов строк.При использовании провайдера Linq, такого как Linq2SQL, ваш код может выглядеть следующим образом:

//GetContext<>() is a method that will return the IQueryable provider
//used to produce MyTable entitiy objects

//pull all records for the past 5 days
var results = from t in Repository.GetContext<MyTable>()
              where t.SomeDate >= DateTime.Today.AddDays(-5)
              && t.SomeDate <= DateTime.Now
              select t;

Это будет переварено провайдером Linq2SQL IQueryable в строку SQL, такую ​​как:

SELECT [each of MyTable's fields] FROM MyTable WHERE SomeDate Between @p1 and @p2; @p1 = '2/26/2011', @p2 = '3/3/2011 9:30:00'

Этот запросможет быть легко переварен механизмом SQL для возврата ТОЧНОЙ необходимой информации (скажем, 500 строк).

Без поставщика Linq, но при желании использовать Linq, вы можете сделать что-то вроде этого:

//GetAllMyTable() is a method that will execute and return the results of
//"Select * from MyTable"

//pull all records for the past 5 days
var results = from t in Repository.GetAllMyTable()
              where t.SomeDate >= DateTime.Today.AddDays(-5)
              && t.SomeDate <= DateTime.Now
              select t;

На первый взгляд, разница невелика.За кулисами дьявол в этих деталях.Этот второй запрос основан на методе, который извлекает и создает экземпляр объекта для каждой записи в базе данных.Это означает, что он должен извлечь все эти записи и создать для них место в памяти.Это даст вам список из 200 МИЛЛИОНОВ записей, что уже не так скромно, поскольку каждая из этих записей была передана по сети и теперь находится в вашем файле подкачки.Первый запрос МОЖЕТ внести некоторые издержки при построении и затем переваривании дерева выражений в SQL, но он НАМНОГО предпочтительнее, чем выгрузка всей таблицы в коллекцию в памяти и итерация по ней.

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