c# - 对 EF-to-Linq 查询进行排序的最快方法是什么?

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

使用 Entity Framework ,理论上更快:

// (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 的经验,在数据库上完成时几乎所有事情都会更快。

PS 我的环境中没有性能工具,并且不确定如何测试它,因此提出了这个问题。

最佳答案

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

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

根据您提供的信息,无法判断哪一个更快

PS:这没有任何意义 Dictionary并不真正关心顺序(我不认为 3 会编译,因为 Dictionary<> ,如果我没记错的话,没有 OrderBy ),但是更改 ToDictionary 。至ToList这就是您的性能答案

关于c# - 对 EF-to-Linq 查询进行排序的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33252346/

相关文章:

sql-server - Go语言: JOIN sql with two different connections/databases

sql-server - 将一个表的一列与另一个表的数据匹配

c# - Desc SQL 附近的语法错误,错误显示在 cmd.ExecuteNonQuery() 上

c# - 冗余/性能更好的代码 VS 优化/性能较差的代码

c# - ZXing.Net 解码条形码给出错误 - 无法从 'System.Drawing.Bitmap' 转换为 'ZXing.LuminanceSource'

c# - 通用列表 c#

c# - 为什么引用的 DLL 与 EXE 一起存储

javascript - 注释掉的代码出错

Javascript:在线测量代码执行时间

c# - 'as dynamic[]' 和 ToArray() 之间的区别