带有大型数据库的 Mvc Telerik 网格
Posted
技术标签:
【中文标题】带有大型数据库的 Mvc Telerik 网格【英文标题】:Mvc Telerik grid With large database 【发布时间】:2013-02-22 10:04:40 【问题描述】:我在我的 mvc 项目中使用 Telerik mvc 网格,我的表有大约 100 万条记录。我的网格加载时间过长。
这是我的查询 //
var bib = (from a in db.Bibs
join inf in db.InfoTypes
on a.InfoTypeId equals inf.Id
where a.Status == "A"
select new BibViewModel
Id = a.Id,
Type = inf.Type,
InfoType = inf.Description,
Title = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "245" && asd.Sfld == "a" select asd.Value).FirstOrDefault(),
Author = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "100" && asd.Sfld == "a" select asd.Value).FirstOrDefault(),
CatalogueDate = a.CatalogDate,
Contents = "",
CreatedOn = a.CreatedOn,
ItemRelation = db.Items.Any(item => item.BibId == a.Id),
IssueRelation = db.Issues.Any(item => item.BibId == a.Id),
);
return View(new GridModel(bib.OrderByDescending(x => x.CreatedOn).Tolist()));
【问题讨论】:
您有大量的连接和嵌套搜索。我注意到的一件事是,您将 Status 存储为字符串数据类型,这比使用 int 要求更高。如果您删除 where 子句 'where a.Status == "A"' 并使用 'take 10000' 取 10000 行,它的执行速度会更快吗?只是一个可能会引导您找到解决方案的建议。 实际上我的查询并没有花费太多时间..我的返回查询花费了很多时间来返回 bcoj 我正在使用 Tolist..如果我删除 tolist 然后我有其他错误“比如超时服务器错误” 【参考方案1】:ToList()
实际上调用了查询,所以如果调用ToList()
花费的时间太长,则说明问题出在查询上。
在 LINQ 中,您可以像 the following post 那样使用分页;思路是使用 Skip 和 Take 来跳过 X 条记录,只取 Y 条记录,如:
var results = (from .. select ..).Skip(X).Take(Y)
对于 1M 条记录,我强烈建议将其替换为存储过程,这对于您尝试执行的操作会快得多。考虑一种自定义分页方法,它非常适合我处理大型结果集:
http://www.neiland.net/blog/article/dynamic-paging-in-sql-server-stored-procedures/ http://www.beansoftware.com/ASP.NET-Tutorials/Paging-Stored-Procedures.aspx http://www.sqlpointers.com/2009/10/custom-sorting-and-paging-in-sql-server.html T-SQL stored procedure with sorting and paging enabled not working properly如果您不能使用存储过程,阅读本文将有助于了解分页需要完成的工作。使用 LINQ,您将需要检查正在生成的 SQL,以了解您还可以使用 SQL 分析器或 LINQPad 微调查询的位置。
【讨论】:
acc。对于客户,我们不能在我们的项目中使用 sp 哇,这不好。但是,您可以像这样在 LINQ 中实现相同的功能:blog.kurtschindler.net/post/paging-through-lists-with-linq。如果您只获取当时需要的记录,您将获得更好的性能。我在上面编辑了我的回复。以上是关于带有大型数据库的 Mvc Telerik 网格的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Matplotlib 中使用带有大型数组的网格网格?
如何使用数据注释中的远程属性验证 Telerik mvc 网格?