2

Использование Entity Framework, в теории, которая быстрее:Каков самый быстрый способ сортировки запроса EF-to-Linq?

// (1) sort then select/project 
// in db, for entire table 
var results = someQuery 
       .OrderBy(q => q.FieldA) 
       .Select(q => new { q.FieldA, q.FieldB }) 
       .ToDictionary(q => q.FieldA, q => q.FieldB); 

или

// (2) select/project then sort 
// in db, on a smaller data set 
var results = someQuery 
       .Select(q => new { q.FieldA, q.FieldB }) 
       .OrderBy(q => q.FieldA) 
       .ToDictionary(q => q.FieldA, q => q.FieldB); 

или

// (3) select/project then materialize then sort 
// in object space 
var results = someQuery 
       .Select(q => new { q.FieldA, q.FieldB }) 
       .ToDictionary(q => q.FieldA, q => q.FieldB) 
       .OrderBy(q => q.FieldA); // -> this won't compile, but you get the question 

Я не эксперт SQL, но интуитивно кажется, что 2 быстрее чем 1 ... это правильно? И как это сравнивается с 3, потому что по моему опыту с EF почти все быстрее, когда делается на db.

PS У меня нет перфекционных инструментов в моей среде, и я не уверен, как это проверить, следовательно, вопрос.

+2

Поскольку Linq использует Отложенное выполнение, 1 и 2 эквивалентны. В 3, вы сортируете с помощью Linq для объектов (потому что вы сначала называете 'ToDictionary()' и вы больше не находитесь в области 'IQueryable'), и сортировка будет выполняться в памяти и без' ORDER BY 'будет излучаться. – haim770

+1

Вы можете проверить его таймерами. Почему вы заказываете словарь? Первые 2 - это разные типы, а затем третьи ... –

+0

@ haim770 Да, но это не решает проблему, которая быстрее в теории, сортировка таблицы или ее сортировка? Это кажется интуитивным, но я узнал, что SQL иногда может быть неинтуитивным. –

ответ

4

Ваш запрос компилируется и выполняется в тот момент, когда вы вызываете ToDictionary, поэтому оба варианта 1 и 2 должны быть одинаковыми и производить один и тот же запрос: вы получаете SELECT FieldA, FieldB FROM table ORDER BY FieldA в обоих случаях.

В-третьих, вы сначала выполняете SQL-запрос (без предложения ORDER BY), а затем ваш тип возвращаемого набора в памяти (данные не сортируются поставщиком БД, а клиентом). Это может быть быстрее или медленнее в зависимости от объема данных, аппаратного обеспечения сервера и клиента, а также от того, как разрабатывается ваша база данных (индексы и т. Д.), Сетевой инфраструктуры и т. Д.

Там нет никакого способа узнать, какой из них будет быстрее с информацией, предоставленной вами

PS: это не имеет никакого смысла, как Dictionary действительно не заботится о порядке (я не думаю, что 3 будет составлять так Dictionary<> , если я не ошибаюсь, у меня нет OrderBy), но смените ToDictionary на ToList и ответьте на свои вопросы

+0

Как правило, 3 должно быть медленнее, чем 1 и 2. Но в теории, которая должна быть быстрее, 1 или 2? Один сортирует таблицу, другой - меньший набор данных. –

+1

Нет, на самом деле, для наиболее распространенных сценариев 1 и 2 будут быстрее. Обычно поставщик базы данных (и серверное оборудование) обычно быстрее упорядочивает, чем центральный процессор клиента. Но нет никакого способа рассказать. Оба типа меньшего набора данных ... SQL-сервер будет «проецировать» (если вы хотите назвать его так) перед сортировкой – Jcl

+1

Конечно, он не будет компилироваться. Словарь имеет 'key' и' value' реквизит не 'FieldA' :) Но его можно заказать ... –

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