[ASP.NET2.0]Repeater C# 分页用法的效率及简单优化(不使用存储过程)

11/4/2009来源:ASP.NET教程人气:7350

 文中http://www.cnblogs.com/xiediy/archive/2008/09/09/1287567.html讲述了Repeater在C Sharp 中的分页方式,我自己在三层架构(大致结构如下)中测试了一下。

三层架构:

1、DAL:封装了SELECT * FROM table事务(1)。

2、BLL:用GetAll()方法封装了对DAL的事务(1)的访问,并返回一个List<Object>。

3、View:通过Repeater遍历出来。

其中:objPage.DataSource = ds.Tables[ " testTable " ].DefaultView;

修改为:objPage.DataSource = tableBLL.GetAll();


测试的结果表示,在Controller(*.aspx.cs)中按上一篇文中的方法定义,空间并不会自动帮你填充Limit条件(如TOP N等),而是不加修改的原封不动地调用你的封装好的方法,原封不动地执行(SELECT * FROM table)获取表的所有数据,就是说,Repeater只会对你返回的结果进行截断处理,就是从数据库中查询所有记录,抽取N条显示在表现层。毋庸置疑,这个效率是很低的。当数据海量时,可以想象这样一次查询的数据量传输占用了多少带宽,还有你的服务器内存。

当你看懂了《[asp.net2.0]Repeater C# 分页用法》,其实对这个进行简单的优化也就不难了。只要把GetAll()修改为GetAll(int From , int To),相应改变里面的逻辑便可。具体的分页逻辑,建议用一个PageUtil的辅助类单独封装起来。

关于SQL 2005分页查询,从网上截取到一下内容,请参考 :

http://www.blogjava.net/mlh123caoer/archive/2006/06/10/51819.html

Microsoft SQL Server 2005 查询分页

微软新的SQL Server 2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程
新的数据库分页功能的核心是一个叫row_number的函数
具体如下:

返回结果集分区内行的序列号,每个分区的第一行从 1 开始。

语法

ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )

备注
ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。

参数
<partition_by_clause>

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。

<order_by_clause>

确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。

有关详细信息,请参阅 OVER 子句 (Transact-SQL)。

返回类型
bigint

示例
以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。

复制代码
USE AdventureWorks
GO
SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0

以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。

复制代码
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;

==============================
进过我对百万行数据记录的分页测试,效率比以前网上能够找到的最好的存储过程(个人意见)稍高。
但是还是比同样的Oralce的分页效率低。

最后我总结一下,如果想查找按ID排的10~20行的记录,可以这么写:

SELECT *
FROM

(

SELECT ROW_NUMBER() OVER (order by ID) AS rowNum, *
FROM table

)

AS a
WHERE a.rowNum>= 10 AND a.rowNum<=20