【发布时间】: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 动态数据中进行分页更有效的方法以及如何实现它。
我想到了两种可能性:
- 有一些神奇的 T-SQL 语言结构具有更好的性能,例如 MySQL 中的
LIMIT <From row number>, <To row number>。 - 我在表格中添加了一个序号列,没有过滤或排序的时候按照序号分页
也许更大的问题是如何在 ASP.Net 动态数据中实现这种自定义分页。任何帮助表示赞赏,即使是分页示例也不是为了提高性能,只是为了给我一个想法。
注意:我无法更改我使用的数据库引擎,所以不推荐 MySQL 或 PostgreSQL 或类似的东西。
【问题讨论】:
-
别担心!我们将始终尝试根据您的情况找到适合您的解决方案。 “X糟透了,用Y代替!”这里从来都不是一个好的答案。
-
谢谢。最后一个注释是某个旧论坛的一个坏习惯,也许不是这里。
标签: c# asp.net performance sql-server-2008 dynamic-data