我编写了一个非常通用的LINQ查询,它在我的应用程序中使用,并且适用于所有情况,但只有一个。我现在只运行SQL Express,所以在我的下载完成之前无法跳转到sql profiler,所以在那之前,我的后续LINQ中是否会出现一些会导致大幅减速的东西?
以下是执行内容的摘要。保持当然是在ToList调用上,并且需要30秒。我将此代码用于我的所有网格视图,并且只有一个支持它。 MyGridView是一个sql视图,在问题数据中只需2秒即可执行并通过Sql Management Studio返回所有16417条记录。最后,当我请求接近数据末尾的页面时,只需要很长时间,所以我假设它与Take和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并发布,如果我在那里找到任何提示。
答案 0 :(得分:3)
请参阅http://msdn.microsoft.com/en-us/library/bb357513.aspx#1
使用LINQ to SQL来组织服务器端的Skip方法非常有用 结果分页,以及更多的东西。但是存在性能问题 在某些情况下,因为LINQ可以构建太难的SQL查询 指定的LINQ表达式。我用MS SQL Server触及了这个问题 2008年。(...)
(...)如果Orgs表中有1000000条记录,则此查询将会 执行很长时间,因为DB服务器将对记录进行排序 内存(不太可能你有一个适当的索引与所有列 排序)。甚至如此简单的查询
orgs.Skip(10).Count()需要大量时间,而
orgs.Count() - 10表现得更快:)
也许这就是问题的根源。