与Paging相关的LINQ操作可能会减慢我的查询速度?

时间:2012-07-11 10:03:16

标签: .net linq sql-server-2008 linq-to-entities

我编写了一个非常通用的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并发布,如果我在那里找到任何提示。

1 个答案:

答案 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表现得更快:)

也许这就是问题的根源。