0

我有以下过滤 200 万条记录的方法,但大多数情况下,如果我想获取最后一页,它会导致实体框架超时,有什么方法可以改进以下代码,使其运行得更快。

 public virtual ActionResult GetData(DataTablesParamsModel param)
        {
            try
            {
                int totalRowCount = 0;
                // Generate Data
                var allRecords = _echoMediaRepository.GetMediaList();
                //Apply search criteria to data

                var predicate = PredicateBuilder.True<MediaChannelModel>();

                if (!String.IsNullOrEmpty(param.sSearch))
                {
                    var wherePredicate = PredicateBuilder.False<MediaChannelModel>();
                    int i;
                    if (int.TryParse(param.sSearch, out i))
                    {
                        wherePredicate = wherePredicate.Or(m => m.ID == i);
                    }
                    wherePredicate = wherePredicate.Or(m => m.Name.Contains(param.sSearch));

                    predicate = predicate.And(wherePredicate);
                }

                if (param.iMediaGroupID > 0)
                {
                    var wherePredicate = PredicateBuilder.False<MediaChannelModel>();

                    var mediaTypes = new NeptuneRepository<Lookup_MediaTypes>();
                    var mediaGroups = mediaTypes.FindWhere(m => m.MediaGroupID == param.iMediaGroupID)
                    .Select(m => m.Name)
                    .ToArray();

                    wherePredicate = wherePredicate.Or(m => mediaGroups.Contains(m.NeptuneMediaType) || mediaGroups.Contains(m.MediaType));
                    predicate = predicate.And(wherePredicate);
                }

                var filteredRecord = allRecords.Where(predicate);

                var columnCriteria = param.sColumns.Split(',').ToList();
                if (!String.IsNullOrEmpty(columnCriteria[param.iSortCol_0]))
                {
                    filteredRecord = filteredRecord.ApplyOrder(
                        columnCriteria[param.iSortCol_0],
                        param.sSortDir_0 == "asc" ? QuerySortOrder.OrderBy : QuerySortOrder.OrderByDescending);
                }

                totalRowCount = filteredRecord.Count();

                var finalQuery = filteredRecord.Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList();

                // Create response
                return Json(new
                {
                    sEcho = param.sEcho,
                    aaData = finalQuery,
                    iTotalRecords = allRecords.Count(),
                    iTotalDisplayRecords = totalRowCount
                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
                throw;
            }
        }
4

1 回答 1

1

您的代码和查询看起来已优化,因此问题应该是数据库中缺少索引会降低 orderby 的性能(由 skip 使用)。

使用与您的非常相似的测试代码,我在本地测试数据库中进行了一些测试,其中包含 500 万行的表(XML 类型列全部填充),并且正如预期的那样,使用按索引排序的查询非常快,但是,通过未索引的列,它们可能需要非常非常长的时间。

我建议您分析动态 Where 和 Order 函数最常用的列,并通过创建相应的索引来进行一些性能测试。

于 2013-07-04T11:02:51.450 回答