一种理论上最快的Web数据库分页方法

2016-01-29 18:24 4 1 收藏

一种理论上最快的Web数据库分页方法,一种理论上最快的Web数据库分页方法

【 tulaoshi.com - ASP 】

  上篇我们谈到了关于数据库传统的三种分页方法和他们的利弊,并且提出了一种理论上最佳的分页方法,本篇我们就来详细说说这种最佳的分页方法。

一:构思。
    在设计Web数据库时,如果我们要编历每一条纪录,那么只有采取分页模式才可以使Web数据库尽快,尽好的呈现给终端用户,也不会因为8秒原则而使用户失去浏览该页的兴趣。但是即使采取分页的办法,当出现多纪录的数据库时,也难免会使我们的用户感到翻页时速度太慢。就如同我的上篇文章说的那样,几乎上一片文章的三种分页方法都有一些缺陷。那么,我们如何做到能让数据库每次就取我们需要的纪录,这个很好实现,有游标返回多个纪录集就可以实现,但是如果让数据库的一端不会因为要刚好检索一页的纪录而大耗资源就很难了。最后,经过我的不断改写程序与测试,终于编写出了我认为理论上最快的Web数据库分页方法。

二:具体实现的存储过程。
    我们结合一个BBS问题来谈谈这种方法。如何让一个BBS每次每页只现实需要的一页纪录呢?而我们需要提供给数据库有那些参数呢?可能会有以下参数。
    第一:就是我们需要的当前的页数。
    第二:当前定义的每一页的纪录集数目。这样你就可以根据需要在页面程序中修改每一页的纪录数。当然,如果你不考虑程序的可扩展性,你也可以在数据库里直接规定每一页有N条纪录即可。
    第三:一个输出参数:就是从数据库里得出当前表中总纪录数目的多少。(注意,他不是一个页的纪录数目)他相当于ADO分页法中的Recordcount。如果你不需要总纪录数目可以不用返回他。
    我们来看具体存储过程的代码。。。

CREATE PROCEDURE dbo.PRO_pageview
(

@tint_tableid tinyint=1,      --这个是BBS的当前版面Id,你可以不用管他。。
@int_pagenow int=0,             
@int_pagesize int=0,
@int_recordcount int=0 output   --就是得出BBS某个版面的总贴数。。

)

AS
set nocount on

declare @int_allid int        
declare @int_beginid int,@int_endid int   
declare @int_pagebegin int, @int_pageend int
    
select @int_allid=count(*) from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid
    select @int_recordcount=@int_allid         --得出该版面的总贴数
            
    declare cro_fastread cursor scroll
    for    select int_id from tab_discuss where tint_level=0 and tint_tableid=@tint_tableid order by int_id desc  --这里定义游标操作,但是不用临时纪录集,而且游标也不需要全部遍历所有纪录集。
    
    open cro_fastread  --打开游标
    select @int_beginid=(@int_pagenow-1)*@int_pagesize+1  得出该页的第一个纪录Id
    select @int_endid = @int_beginid+@int_pagesize-1      得出该页的最后一个纪录的Id
    
    fetch absolute  @int_beginid from cro_fastread into @int_pagebegin 将他的Id传给一个变量该页开始的Id
    if @int_endid@int_allid        --这里要注意,如果某一页不足固定页数的纪录时。如只有一页纪录,而且纪录少于我们定义的数目。或者是最后一页时。。。
        fetch last from cro_fastread into @int_pageend   --直接将游标绝对定位到最后一条纪录,得出他的id号来。。。
    else
        fetch absolute @int_endid from cro_fastread into @int_pageend
                
    select int_id,tint_level,tint_children,var_face,var_subject,datalength(txt_content) as int_len,sint_hits,var_url,var_image,var_user,dat_time,tint_tableid,bit_kernul from tab_discuss where tint_tableid=@tint_tableid  and int

来源:http://www.tulaoshi.com/n/20160129/1505638.html

延伸阅读
标签: ASP
  antshome(原作)首发:CSDN 一条语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 10 = 每页记录数 20 = (当前页 + 1) * 每页记录数 以上语句即可以实现分页,但是最后取出的结果排序是升序,如果需...
Oracle数据库数据对象中最基本的是表和视图,其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。 表和视图 Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大。视图是一个...
1、 用Oracle WebServer构建Web数据库应用 Oracle 8服务器是一个完善的信息管理环境。它是一个大量数据的储藏所,并给用户提供对这些数据的快速访问。它能够支持C/S结构进行分布式处理和Web计算等。利用其服务器选件之一的WebServer,可以提供实现Web数据库应用的强大功能。 一般来说,实现Web数据库应用可以在WebServer端提供CG...
标签: SQLServer
  Web数据库中间件技术 曾晓金    (云南工业大学计算机应用重点实验室 昆明 650051) 摘要:介绍了Web数据库的几种中间件解决方案,并比较了它们的特色与不足,以及Web数据库出现的相应最新技术。 关键词:中间件 CGI ASP ISAPI NSAPI JDBC 随着Internet/Intrranet的兴起与发展,Web服务器与数据库服务器的连接...
标签: SQLServer
  说到数据库,我认为不能不先谈数据结构。1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法。尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法。面向对象的程序开发,要做的第一件事就是,先分析整个...

经验教程

101

收藏

53
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部