分页算法,还可以更好

转载 2006年06月09日 17:03:00

分页算法,是Web开发人员很关心的一个问题,几乎每个数据库相关的应用都要涉及到分页算法,有很多人写过这方面的文档,似乎没有什么好讨论的了;但实际上换一种数据的表现形式,就可以采用一种更好的分页算法,那我们现在就看看还能不能做得更好。

先说说已有的一些方法。
一是通过 DataGrid 分页,这种方式最简单,但效率不高,需要读取所需数据前面的所有数据。
二是通过指定起始记录和记录数的 DbDataAdapter.Fill 来填充 DataSet 的分页方式,这种方式也简单,但同样效率不高,也需要读取所需数据前面的所有数据。
三是通过多个 select top 和多次排序,从表的中间选取需要的记录;为了使相邻页的数据不重复,需要使用 not in,会导致在选择大数据量的表格的尾部数据时,数据库的性能会有很大的降低。

假设我们换一种表格的展现形式,就以传统的 C/S 应用下的带滚动条的 Grid 展现方式为例;其实这种方式才是数据库表格最合适的展现方式,而 Web 应用下常用的 1,2,3....的页码连接方式或上一页、下一页按钮的页码浏览条方式,都是不得已而为之,因为不能通过简单的技术,在 Web 应用下实现带滚动条的 Grid。

数据库的表格都是带有主键的,以区分表格中不同的记录;用户界面上的 Grid 里的数据从逻辑上也是有主键的,否则数据会有歧义,但大多数的应用,没有设置,也无法知道所读出数据的主键;即使少数应用设置了,也知道所读数据的主键,但并没有将其应用到分页中;其实只要知道了所读数据的主键,就可以非常容易的进行分页。

首页的算法很简单
 select top 页大小 * from 表名 order by 主键

对于带滚动条的表格,数据是一页一页顺序滚动,即使拖动滚动条,也可以一页页滚动到所选的位置,当拖动到一个新页时的算法为
select top 页大小 * from 表名 where 主键 > 上一页末记录的主键 order by 主键

如果采用了缓存的方式,所有的数据都只需要下载一次,只有滚动到尾部时,才下载新的数据。

这种算法要求知道 Grid 中数据的主键,并将主键的数据应用到分页;对于多主键和排序的表格,算法是一样的,只是语句复杂了一些。不但可以从首页开始,也可以从末页开始,向前翻滚。
这个算法的性能没有问题,对于不论多大的表,选择那个位置的记录都是一样的,比较适合于用首页、上一页、下一页和末页的分页选择方式,更适合于带滚动条的 Grid ;不适合于指定页码的分页。

采用该算法的带滚动条的 Grid 可以参考我们的演示 www.BizStruct.cn

http://bizstruct.cnblogs.com/archive/2006/05/29/412458.html

jsp分页算法

  • 2013年06月11日 20:51
  • 24KB
  • 下载

asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)

前台代码片段如下(webform8.aspx): WebForm8

海量数据库的查询优化及分页算法方案

海量数据库的查询优化及分页算法方案   很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误...

高老师的算法分页

  • 2013年06月05日 13:56
  • 1.08MB
  • 下载

海量数据库的查询优化及分页算法方案

(一)深入浅出理解索引结构   实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(no...

分页存储管理算法VB程序演示

  • 2006年02月23日 09:05
  • 576KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分页算法,还可以更好
举报原因:
原因补充:

(最多只允许输入30个字)