2

我编写了一个非常通用的 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;
}

有什么东西会被认为是坏的、错误的、危险的吗?当我安装了探查器的副本时,我会尝试通过生成的 sql 并在我发现任何提示时发布。

4

1 回答 1

3

请参阅http://msdn.microsoft.com/en-us/library/bb357513.aspx#1

Skip 方法对 LINQ to SQL 组织服务器端结果分页和其他一些东西非常有用。但是在某些情况下存在性能问题,因为 LINQ 可以从指定的 LINQ 表达式构建过于困难的 SQL 查询。我在 MS SQL Server 2008 中遇到了这个问题。(...)

(...) 如果 Orgs 表中有 1000000 条记录,则此查询将执行很长时间,因为数据库服务器将对内存中的记录进行排序(不太可能您有一个所有列排序的适当索引)。甚至如此简单的查询

orgs.Skip(10).Count() 需要大量时间,而

orgs.Count()-10 执行得更快:)

也许这就是问题的根源。

于 2012-07-11T10:13:09.657 回答