排序EF-to-Linq查询的最快方法是什么?

时间:2015-10-21 06:25:49

标签: c# sql-server performance entity-framework database-performance

使用实体框架,理论上更快:

// (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我的环境中没有穿孔工具,也不确定如何测试,因此问题。

1 个答案:

答案 0 :(得分:4)

您的查询正在编译并在您致电ToDictionary时执行,因此1和2应该相同并产生相同的查询:在这两种情况下都会得到SELECT FieldA, FieldB FROM table ORDER BY FieldA

第三种不同:首先执行SQL查询(不带ORDER BY子句),然后将返回的内存排序在内存中(数据不是由数据库提供程序排序,而是由客户端排序)。这可能更快或更慢,具体取决于数据量,服务器和客户端的硬件,以及数据库的设计方式(索引等),网络基础架构等等。

根据您提供的信息,无法确定哪一个会更快

PS:这没有任何意义,因为Dictionary并不真正关心订单(我不认为3会自Dictionary<>编译,如果我不是错误,没有OrderBy),但是将ToDictionary更改为ToList并且您的绩效答案是