Kendo MVC ToDataSourceResult 对于大型 IQueryable 极其缓慢
Posted
技术标签:
【中文标题】Kendo MVC ToDataSourceResult 对于大型 IQueryable 极其缓慢【英文标题】:Kendo MVC ToDataSourceResult extremly slow with large IQueryable 【发布时间】:2013-03-28 10:41:33 【问题描述】:我广泛使用了 Kendo DataSourceResult ToDataSourceResult(this IQueryable enumerable, DataSourceRequest request);
扩展,直到现在在查询包含 4000 万条记录的表时才注意到性能问题。
我作为基准编写的 take 10 查询,因为它与传入的请求相同。
这是我的阅读操作:
public ActionResult ReadAll([DataSourceRequest] DataSourceRequest
var startTimer = DateTime.Now;
var context = Helpers.EFTools.GetCADataContext();
Debug.WriteLine(string.Format("0 : Got Context", DateTime.Now - startTimer));
var events = from e in context.Events
select
new Models.Event()
Id = e.Id,
DateTime = e.EventDateTime,
HostId = e.Door.HostId,
SiteId = e.Door.Host.SiteId,
UserId = (int)e.UserId,
UserName = e.User.FirstName + " " + e.User.Surname,
DoorId = e.DoorId,
Door = e.Door.Name,
Description = e.Description,
SubDescription = e.SubDescription
;
Debug.WriteLine(string.Format("0 : Built Query", DateTime.Now - startTimer));
var tenRecods = events.OrderByDescending(i => i.DateTime).Take(10).ToList();
Debug.WriteLine(string.Format("0 : Taken 10", DateTime.Now - startTimer));
var result = events.ToDataSourceResult(request);
Debug.WriteLine(string.Format("0 : Datasource Result", DateTime.Now - startTimer));
return this.Json(result);
Debug 的输出:
00:00:00.1316569 : Got Context
00:00:00.1332584 : Built Query
00:00:00.2407656 : Taken 10
00:00:21.5013946 : Datasource Result
虽然有时查询会超时。 使用 dbMonitor 我捕获了两个查询,首先手动取 10:
"Project1".id,
"Project1"."C1",
"Project1".hostid,
"Project1".siteid,
"Project1".userid,
"Project1"."C2",
"Project1".doorid,
"Project1"."name",
"Project1".description,
"Project1".subdescription
FROM ( SELECT
"Extent1".id,
"Extent1".userid,
"Extent1".description,
"Extent1".subdescription,
"Extent1".doorid,
"Extent2"."name",
"Extent2".hostid,
"Extent3".siteid,
CAST("Extent1".eventdatetime AS timestamp) AS "C1",
"Extent4".firstname || ' ' || "Extent4".surname AS "C2"
FROM public.events AS "Extent1"
INNER JOIN public.doors AS "Extent2" ON "Extent1".doorid = "Extent2".id
INNER JOIN public.hosts AS "Extent3" ON "Extent2".hostid = "Extent3".id
INNER JOIN public.users AS "Extent4" ON "Extent1".userid = "Extent4".id
) AS "Project1"
ORDER BY "Project1"."C1" DESC
LIMIT 10
以及 ToDataSourceRequest 查询:
SELECT
"GroupBy1"."A1" AS "C1"
FROM ( SELECT Count(1) AS "A1"
FROM public.events AS "Extent1"
INNER JOIN public.doors AS "Extent2" ON "Extent1".doorid = "Extent2".id
) AS "GroupBy1"
这是传入的DataSourceRequest request
参数:
request.Aggregates Count = 0
request.Filters Count = 0
request.Groups Count = 0
request.Page 1
request.PageSize 10
request.Sorts Count = 1
这是var result = events.ToDataSourceResult(request);
的结果
result.AggregateResults null
result.Data Count = 10
result.Errors null
result.Total 43642809
如何使用DataSourceRequest
以更高效、更快的方式从事件 IQueryable 中获取DataSourceResult
?
【问题讨论】:
从第二个 SQL 可以看出,您没有在 DataSourceRequest 中启用分页。启用分页很有帮助。 我已更新我的答案以包含请求参数。var result = events.ToDataSourceResult(request);
的结果仅包括 10 项。我以为这是分页,如果不是,我该如何启用它?
您的请求确实包含寻呼信息。但是,您显示的 SQL 语句没有。我认为这是一个不同的 SQL 语句。您可以跳过 ToDataSourceResult 并实现自定义绑定,如下所示:docs.kendoui.com/getting-started/using-kendo-with/aspnet-mvc/…
【参考方案1】:
在实现具有大量调试输出时间戳的自定义绑定(由Atanas Korchev 建议)后,很明显是什么导致了性能问题,即总数。
查看我捕获的 SQL 支持这一点,不知道为什么我以前没有看到它。
快速获取总行数是另一个问题,但会在此处发布我找到的任何答案。
【讨论】:
这个帖子太老了,但是这个问题还是存在的……你有什么办法解决“total count”慢的问题吗? 在另一条评论之后还有 3 年。总计数超时问题的解决方案是什么?以上是关于Kendo MVC ToDataSourceResult 对于大型 IQueryable 极其缓慢的主要内容,如果未能解决你的问题,请参考以下文章
Kendo UI Web 和 Kendo UI ASP.NET for MVC 之间的区别