与分页相关的哪些 LINQ 操作可能会减慢我的查询速度?
Posted
技术标签:
【中文标题】与分页相关的哪些 LINQ 操作可能会减慢我的查询速度?【英文标题】:What LINQ operation related to Paging could be slowing down my query? 【发布时间】:2012-07-11 10:03:15 【问题描述】:我编写了一个非常通用的 LINQ 查询,它在我的整个应用程序中都使用,并且在除一种情况之外的所有情况下都非常有效。我目前只运行 SQL Express,所以在我的下载完成之前无法跳转到 sql profiler,所以在那之前,我的以下 LINQ 中是否有一些突出的东西会导致速度大幅下降?
以下是执行内容的摘要。延迟当然是在 ToList 调用上,需要 30 秒。我将这段代码用于我所有的网格视图,只有一个可以保留它。 MyGridView 是一个 sql 视图,在问题数据中只需 2 秒即可通过 Sql Management Studio 执行并返回所有 16417 条记录。最后,当我请求接近数据末尾的页面时,它只需要这么长时间,所以我假设它与 Take and Skip 实现有一些关系。
private void Demo()
// using LINQ To Entity...
using (var entities = new MyEntities())
int page = 1641;
int pageSize = 10;
IQueryable<MyGridView> results = entities.MyGridView;
results = results.Where(r => r.DeletedDate == null);
var resultCount = results.Count();
results = ApplyPaging(results, page, pageSize);
// On the problem data, ToList takes a good 30 seconds to return just 10 records
var resultList = results.ToList();
private IQueryable<T> ApplyPaging<T>(IQueryable<T> data, int currentPage, int pageSize)
if (pageSize > 0 && currentPage > 0)
data = data.Skip((currentPage - 1) * pageSize);
data = data.Take(pageSize);
return data;
有什么东西会被认为是坏的、错误的、危险的吗?当我安装了 profiler 的副本时,我会尝试检查生成的 sql 并在我发现任何提示时发布。
【问题讨论】:
这段代码的计数步骤非常快。我只在这里包含它,因为它是唯一的其他东西。因此,除非它对查询有后遗症,否则它不会阻止。 是的,我意识到在你点击下面的问题代码之前就已经完成了,我的错误。 【参考方案1】:见http://msdn.microsoft.com/en-us/library/bb357513.aspx#1
Skip 方法对于 LINQ to SQL 组织服务器端非常有用 结果分页,还有更多的东西。但是存在性能问题 在某些情况下,因为 LINQ 可以从 指定的 LINQ 表达式。我用 MS SQL Server 碰到了这个问题 2008. (...)
(...) 如果 Orgs 表中有 1000000 条记录,则此查询将 执行很长时间,因为数据库服务器将在 内存(不太可能你有一个包含所有列的适当索引 订购)。甚至这么简单的查询
orgs.Skip(10).Count() 需要大量时间,而
orgs.Count()-10 执行得更快:)
也许这就是问题的根源。
【讨论】:
因此,如果查询没有有效排序,则跳过会使查询过于复杂。我通过简单地强制一个 ID 的 OrderBy (默认索引)来解决这个问题。不幸的是,当有人要求不同的订购时,这仍然是一个问题,但至少我知道现在的阻碍是什么。谢谢¬! @Arkiliknam 很高兴能为您提供帮助 - 感谢您接受答案以上是关于与分页相关的哪些 LINQ 操作可能会减慢我的查询速度?的主要内容,如果未能解决你的问题,请参考以下文章