【问题标题】:LINQ: Most Efficient Where Condition When Selecting a Single Item out of a MillionLINQ:从百万中选择单个项目时最有效的 Where 条件
【发布时间】:2016-10-13 02:19:19
【问题描述】:

假设
数据库中有大约一百万个项目和一个存储过程 返回所有项目

在不改变存储过程的情况下,返回单个项目的最有效的where条件是什么?

尝试

var item = db.GetInfo().Where(i => i.url == url).Select(i => i.ID).FirstOrDefault();
var item = db.GetInfo().Where(i => i.ProductType == 5 && i.url == url).Select(i => i.ID).FirstOrDefault();

【问题讨论】:

  • @DavidL 那时数据在内存中,因此数据库索引不相关。
  • @DavidL:这两种方式都不使用索引。过滤器应用于存储过程的输出。
  • 那么您有一个返回百万项的存储过程?我会专注于这一点,而不是如何让你的 where 更高效
  • @Servy:我不会做出这样的假设。 db 表示一个 EF 实例,它很可能是一个 IQueryable
  • @RobertHarvey:这不是假设。 OP 说这是一个“存储过程”。

标签: c# linq


【解决方案1】:

最有效的where条件返回单个项目

假设 SP“返回所有项目”,如果您想要的只是第一个满足条件的项目,则只需使用 FirstOrDefault。如果存在这样的项目,它将在找到它的那一刻返回。在最坏的情况下,它将在 o(n)

var item = db.GetInfo().FirstOrDefault(i => i.url == url)?.ID;
var item = db.GetInfo().FirstOrDefault(i => i.ProductType == 5 && i.url == url)?.ID

两个查询的效率都相同,为 o(n) - 如果在数据库中执行,这些字段上存在索引将会产生影响。例如,如果ProductType 字段有索引,那么第二个查询会更高效

毫无疑问,更好的选择是这将发生在数据库中而不是内存中......但如果无法更改......

【讨论】:

  • 这更快,因为它有时可以提前退出,无需迭代所有百万条记录。
  • 但这与 db.GetInfo().FirstOrDefault(i => i.ProductType == 5 && i.url == url)?.ID;是什么降低了效率?
  • 对我来说,这就像一门完整的编程课程,浓缩在几行代码中。我感谢您的努力和对细节的关注!
  • @GiladGreen meta.stackoverflow.com/search?q=fastest+gun - 发布半成品答案有其代价 :) 并且没有办法通知选民有关变化 - 所以反对票坚持(不是我的反对票 - 但很可能是)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多