【问题标题】:How to improve ASP.Net Dynamic Data pagination performance如何提高 ASP.Net 动态数据分页性能
【发布时间】:2011-08-30 17:38:51
【问题描述】:

我正在使用 ASP.Net 动态数据(.Net Framework 4.0 版)和 SQL Server 2008 来显示一组表中的数据。数据库中有一个主表,包含83列,854581行数据,预计还会增长。

我对默认模板几乎没有修改,大多数操作对于商业网站来说都足够快捷,包括过滤、外键显示等。然而,寻呼机被证明是一个主要的性能问题。

在我使用数据库优化顾问进行任何优化之前,主表列表页面甚至不会显示为简单的计数查询超时。经过所有优化后,前几百页将毫无问题地显示,但是超过 1000 页的任何内容都慢得难以忍受,最后一页超时。

请注意,我已经使用 Database Tuning Advisor 优化了最后一页的查询,但它根本没有给我任何建议。

我尝试使用row_number() 运行一个非常简单的查询来查看最后一页,类似于下面的查询:

SELECT TOP 10* FROM 
    (SELECT *, row_number() OVER (ORDER BY [Primary Key Column] ASC) AS [rn]
     FROM [Master Table]) AS TB1
WHERE TB1.rn > 854580

上述查询在第一次执行时大约需要 20 秒才能完成,而 SQL Server 服务sqlservr.exe 占用了 1,700 KiB 内存(我使用的是 32 位窗口,没有特殊的内核开关,因此,每个进程最多有 2 GiB 的地址空间)。

所以,我的问题是,有没有比使用row_number() 在 ASP.Net 动态数据中进行分页更有效的方法以及如何实现它。

我想到了两种可能性:

  1. 有一些神奇的 T-SQL 语言结构具有更好的性能,例如 MySQL 中的 LIMIT <From row number>, <To row number>
  2. 我在表格中添加了一个序号列,没有过滤或排序的时候按照序号分页

也许更大的问题是如何在 ASP.Net 动态数据中实现这种自定义分页。任何帮助表示赞赏,即使是分页示例也不是为了提高性能,只是为了给我一个想法。

注意:我无法更改我使用的数据库引擎,所以不推荐 MySQL 或 PostgreSQL 或类似的东西。

【问题讨论】:

  • 别担心!我们将始终尝试根据您的情况找到适合的解决方案。 “X糟透了,用Y代替!”这里从来都不是一个好的答案。
  • 谢谢。最后一个注释是某个旧论坛的一个坏习惯,也许不是这里。

标签: c# asp.net performance sql-server-2008 dynamic-data


【解决方案1】:

即使是 100 万行,20 秒也很长 - 检查您的 SQL Server 索引!

还要确保您只检索列表视图中所需的数据列。 (你提到了 83 列......你没有在列表视图中显示所有这些。

我能想到的另一种方法是使用带有 Skip() 和 Take() 的 Linq 查询表达式在分页时一次获取一个页面。当然,这意味着您将更频繁地查询更少的数据。

【讨论】:

  • 用主键列分页数据非常快。然而 linq Skip()Take() 生成的 row_number() 非常慢。我将尝试减少测试期间选择的列数,但我可以向您保证,83 列中的大部分必须出现在列表视图中(除非有一种方法可以在详细信息视图中显示它们,但不是在列表视图中,我还没有找到),加上一些外键关系。
  • 这是在某些页面模板中隐藏列的方法:csharpbits.notaclue.net/2008/10/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
相关资源
最近更新 更多