Mysql 在这里,我添加了额外的详细信息,并添加了对这两个查询的答案。@马克:看来您以错误的方式实现了对数据库的访问。您的代码似乎从数据库中获取了所有20K数据,然后用C代码进行排序和分页。您编写了存储过程的使用方法,但在当前代码中没有这样做。我认为,对于C代码,您

Mysql 在这里,我添加了额外的详细信息,并添加了对这两个查询的答案。@马克:看来您以错误的方式实现了对数据库的访问。您的代码似乎从数据库中获取了所有20K数据,然后用C代码进行排序和分页。您编写了存储过程的使用方法,但在当前代码中没有这样做。我认为,对于C代码,您,mysql,entity-framework,entity-framework-4,jqgrid,Mysql,Entity Framework,Entity Framework 4,Jqgrid,在这里,我添加了额外的详细信息,并添加了对这两个查询的答案。@马克:看来您以错误的方式实现了对数据库的访问。您的代码似乎从数据库中获取了所有20K数据,然后用C代码进行排序和分页。您编写了存储过程的使用方法,但在当前代码中没有这样做。我认为,对于C代码,您可以使用视图来查看哪些代码是不可访问的。使用IQueryable代替实体框架似乎也是可疑的。此外,即使所有其他事情都很完美,知道按哪个列进行排序也是很重要的。如果在该列上没有索引进行排序,则.ToList()会强制执行查询求值。我已经使用了控制


在这里,我添加了额外的详细信息,并添加了对这两个查询的答案。@马克:看来您以错误的方式实现了对数据库的访问。您的代码似乎从数据库中获取了所有20K数据,然后用C代码进行排序和分页。您编写了存储过程的使用方法,但在当前代码中没有这样做。我认为,对于C代码,您可以使用视图来查看哪些代码是不可访问的。使用
IQueryable
代替实体框架似乎也是可疑的。此外,即使所有其他事情都很完美,知道按哪个列进行排序也是很重要的。如果在该列上没有索引进行排序,则
.ToList()
会强制执行查询求值。我已经使用了控制器操作,即使我将评估推迟到我设置pagedQuery结果的位置,评估的时间成本也是类似的。我甚至硬编码了其他值,并将查询计算完全推迟到控制器的末尾,在那里我只计算5-30行的数据集(理论上),时间成本基本相同。但这也是我问这个问题的部分原因。在我看来,在pagedQuery中计算查询所需的时间应该比在filteredQuery中计算查询所需的时间要少,因为filteredQuery将返回略多于20K的结果。@Mark我很惊讶,将整个结果集具体化,然后进行筛选与仅查询所需结果没有什么区别。在
var filteredQuery
行运行时变量包含20029条记录,耗时351毫秒(我家的电脑有一个SSD,比我的prod服务器快得多)T2/T3诊断时间总共增加了2毫秒。最大的时间接收器是来自数据库的明显副本。我将事情切换到基于pagedQuery生成列表的位置,这花费了同样多的时间(更确切地说,是419毫秒)。
sql = "System.Collections.Generic.List`1[PeerTrader.usercollectionenhancedview].OrderBy(Param_0 => Param_0.CardName).Skip(90).Take(30)"
public ActionResult GridData(string sidx, string sord, int page, int rows, bool _search, string filters)
    {
    ///**********Diagnostics Start********
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    ///**********Diagnostics End********

    MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
    int currentUserID = (int)currentUser.ProviderUserKey;

    var serializer = new JavaScriptSerializer();
    //Filters f = (!_search || string.IsNullOrEmpty(filters)) ? null : serializer.Deserialize<Filters>(filters);
    Filters_IQueryable f = (!_search || string.IsNullOrEmpty(filters)) ? null : serializer.Deserialize<Filters_IQueryable>(filters);

    IQueryable<usercollectionenhancedview> query = db.SingleUserCollectionView(currentUserID).AsQueryable();


    var filteredQuery = (f == null ? query : f.FilterObjectSet(query)).ToList();

    ///**********Diagnostics Start********
    sw.Stop(); long t1 = sw.ElapsedMilliseconds; sw.Start();
    System.Diagnostics.Debug.WriteLine("");
    System.Diagnostics.Debug.WriteLine("**************");
    System.Diagnostics.Debug.WriteLine("T1: " + t1);
    ///**********Diagnostics End********

    int totalRecords;

    totalRecords = filteredQuery.Where(x => x.fk_IdUsers == currentUserID).Count();
    pagedQuery = filteredQuery.AsQueryable().Where(x => x.fk_IdUsers == currentUserID).OrderBy(sidx + " " + sord).Skip((page - 1) * rows).Take(rows);

     ///**********Diagnostics Start********
     sw.Stop(); long t2 = sw.ElapsedMilliseconds; sw.Start();
     System.Diagnostics.Debug.WriteLine("T2: " + t2);
     ///**********Diagnostics End********
var filteredQuery = (f == null ? query : f.FilterObjectSet(query)).ToList();
totalRecords = filteredQuery.Where(x => x.fk_IdUsers == currentUserID).Count();
pagedQuery = filteredQuery.AsQueryable().Where(x => x.fk_IdUsers == currentUserID)
                          .OrderBy(sidx + " " + sord).Skip((page - 1) * rows).Take(rows);