上一篇:在ASP.NET 2.0中使用页面导航控件(2) >>
DataGrid基于Access的快速分页法(1)
目前的分页方法
DataGrid内建的分页方法是使用诸如“SELECT * FROM <TABLE>”的SQL语句从数据库表中取出所有的记录到DataSet中,DataGrid控件绑定到该DataSet之后,它的自动分页功能会帮你从该DataSet中筛选出当前分页的数据并显示出来,其他没有用的数据将被丢弃。
还有一种方法是使用自定义分页功能,先将DataGrid的AllowCustomPaging属性设置为True,再利用DataAdapter的Fill方法将数据的筛选工作提前到填充DataSet时,而不是让DataGrid帮你筛选:
public int Fill (
DataSet dataSet, //要填充的 DataSet。
int startRecord, //从其开始的从零开始的记录号。
int maxRecords, //要检索的最大记录数。
string srcTable //用于表映射的源表的名称。
);
该方法首先将来自查询处的结果填充到DataSet中,再将不需要显示的数据丢弃。当然,自定义分页功能需要完成的事情还不止这些,本文将在后面详细介绍。
以上两种方法的工作原理都是先从数据库中取出所有的记录,然后筛选出有用的数据显示出来。可见,两种方法的效率基本上是一致的,因为它们在数据访问阶段并没有采取有效的措施来减少Access对磁盘的访问次数。对于小数量的记录,这种开销可能是比较小的,如果针对大量数据的分页,开销将会非常巨大,从而导致分页的速度非常的慢。换句话说,就算每个DataGrid分页面要显示的数据只是一个拥有几万条记录的数据库表的其中10条,每次DataGrid进行分页时还是要从该表中取出所有的记录。
很多人已经意识到了这个问题,并提出了解决方法:用自定义分页,每次只从数据库中取出要显示的数据。这样,我们需要在SQL语句上下功夫了。由于Access不支持真正的存储过程,在编写分页算法上就没有SQL Server那么自由了。SQL Server可以在存储过程中利用临时表来实现高效率的分页算法,受到了广泛的采用。而对于Access,我们必须想办法在一条SQL语句内实现最高效的算法。
用一条SQL语句取得某段数据的方法有好几种。算法不同,效率也就不同。我经过粗略的测试,发现效率最差的SQL语句执行时耗费的时间大概是效率最高的SQL语句的3倍!而且这个数值会随着记录总数的增加而增加。下面将介绍其中两条常用的SQL语句。
为了方便接下来的讨论,我们先约定如下:
变量 说明 变量 说明
@PageSize 每页显示的记录总数 @MiddleIndex 中间页的索引
@PageCount 分页总数 @LastIndex 最后一页的索引
@RecordCount 数据表的记录总数 @TableName 数据库表名称
@PageIndex 当前页的索引 @PrimaryKey 主键字段名称
@FirstIndex 第一页的索引 @QueryFields 要查询的字段集
变量 定义
@PageCount (int)Math.Ceiling((double)@RecordCount / @PageSize)
@FirstIndex 0
@LastIndex @PageCount – 1
@MiddleIndex (int)Math.Ceiling((double)@PageCount / 2) – 1
先让我们看看效率最差的SQL语句:
SELECT TOP @PageSize * FROM @TableName
WHERE @PrimaryKey NOT IN (
SELECT TOP @PageSize*@PageIndex @PrimaryKey FROM @TableName
ORDER BY @PrimaryKey ASC
) ORDER BY @PrimaryKey ASC
这条SQL语句慢就慢在NOT IN这里,主SELECT语句遍历的每个@PrimaryKey的值都要跟子SELECT语句的结果集中的每一个@PrimaryKey的值进行比较,这样时间复杂度非常大。这里不得不提醒一下大家,平时编写SQL语句时应该尽量避免使用NOT IN语句,因为它往往会增加整个SQL语句的时间复杂度。
另一种是使用了两个TOP和三个ORDER BY的SQL语句,如下所示:
SELECT * FROM (
SELECT TOP @PageSize * FROM (
SELECT TOP @PageSize*(@PageIndex+1) * FROM @TableName
ORDER BY @PrimaryKey ASC
) TableA ORDER BY @PrimaryKey DESC
) TableB ORDER BY @PrimaryKey ASC
这条SQL语句空间复杂度比较大。如果要显示的分页面刚好是最后一页,那么它的效率比直接SELECT出所有的记录还要低。因此,对于分页算法,我们还应该具体情况具体分析,不能一概而论。下面将简单介绍一下相关概念,如果您对主键和索引非常熟悉,可以直接跳过。
下一篇:DataGrid基于Access的快速分页法(2) >>
相关文章:
- · 控制输出字符串的长度,可以区别中英文
- · 存储过程编写经验和优化措施
- · ASP.NET入门随想之工业流水线
- · ASP.NET入门随想之抽象的力量
- · ASP.NET入门随想之瘦子与胖子的故事
- · ASP.NET入门随想之开卷有益
- · ASP.NET中随机数生成及应用(2)
- · ASP.NET中随机数生成及应用(1)
- · ASP.NET中实现Flash与.NET的紧密集成(1)
- · ASP.NET中实现Flash与.NET的紧密集成(2)
- · 深度解析ASP.NET2.0中的Callback机制(1)
- · ASP.NET+AJAX解决网页打开等待问题(1)
- · ASP.NET+AJAX解决网页打开等待问题(2)
- · C#中为DataGrid添加下拉列表框
- · ASP.NET开发员工业绩评测中心(1)
- · ASP.NET开发员工业绩评测中心(2)
- · 在ASP应用程序中限制重复提交同一表单
- · 用VB将ASP代码封装成DLL
- · 如何在IIS上搭建WAP网站
- · asp程序错误详细说明例表
- · 短信发送程序
- · 用ASP实现电子贺卡
- · ASP.NET创建并使用Web组件(1)
- · asp.net生成缩略图
- · 动态增加的DropDownList如何保持状态
- · ASP.NET创建并使用Web组件(2)
- · ASP.NET创建并使用Web组件(3)
- · 在ASP.NET中显示进度条
- · ASP.NET Whidbey中实现Provider(1)
- · ASP.NET Whidbey中实现Provider(2)
- · DataGrid控件使用技巧(1)
- · ASP.NET页面间数据传递小结(1)
- · ASP.NET页面间数据传递小结(2)
- · ASP.NET页面间数据传递小结(3)
- · 用ASP.NET创建自定义文本框(1)
- · 了解ASP.NET页面对象模型(1)
- · 了解ASP.NET页面对象模型(2)
- · XmlTextWriter创建XML文件(2)
