【发布时间】:2012-08-20 07:58:59
【问题描述】:
有一个基于 ASP.NET MVC3 的图书管理系统 web 应用程序。 点击图书索引页面时,数据查询很慢,需要等待几秒才能响应。 BookController中Action Index的代码如下:
public ViewResult Index(string sortOrder, int? page)
{
ViewBag.NameSortParam = string.IsNullOrEmpty(sortOrder) ? "desc" : "";
ViewBag.CurrentSort = sortOrder;
BookModel books = from b in db.Books select b; // db = new BookContext();
switch (sortOrder) {
case "desc":
books = books.OrderByDescending(b => b.Name);
break;
default:
books = books.OrderBy(b => b.Name);
break;
}
int pageSize = 15;
int pageNumber = (page ?? 1);
return View(books.ToPagedList(pageNumber, pageSize));
}
在我看来,慢的主要原因是服务器在所有数据都准备好之前没有响应客户端。这个过程需要很长时间。
不知道如何解决这个问题,请问有什么方法可以提高这种情况下的数据查询性能吗?谢谢!
更新: 后端数据库是 SQL Server Compact Edition 4.0
更新
我在下面更新了我的逻辑代码,orderby 在skip 和take 语句之前使用。一切顺利。谢谢大家的帮助。
books = (from b in db.Books
orderby b.Name descending
select b)
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList();
【问题讨论】:
-
你的逻辑很简单,所以这里没有太多需要改进的地方。您可以对
Book实体进行缓存(请求/会话/应用程序),或者在Book表的Name列上添加数据库索引。索引还为 ORDER BY 查询提供种子。而且也很奇怪,需要很长时间,Books表中有多少行?也许缓慢是由其他代码引起的。你做过分析吗? -
我猜 ToPagedList 正在从“书籍”表中获取所有数据。如果是这样,你不应该使用这个函数来获取你的页面数据。使用程序获取页面数据是最好的方法。对于表格,您可以为某些列设置索引。
-
先检查
ToPagedList是在数据库服务器还是内存中应用分页? -
你能分析一下 books.ToPagedList 生成的 SQl,看看那里发生了什么。
-
@nemesv nemesv,谢谢你的回答。我是数据查询和缓存技术的新手,你说的我很难实现。顺便说一句,数据库中没有存储大数据,最多一万。
标签: asp.net asp.net-mvc-3 entity-framework linq-to-sql