文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页精文荟萃软件资讯 → 数据分页方法新思路,速度非常快

数据分页方法新思路,速度非常快

时间:2004/10/7 19:17:00来源:本站整理作者:蓝点我要评论(0)


            
             
              
             
            

               
               

            



            这篇文章要达到的目的就是,实现大数据分页浏览并最优化速度。

建立一个web 应用,分页浏览功能必不可少;这个问题也是长久以来最普遍的问题,目前也得到了较好的解决,其中象ASP 程序的分页算法有很多,比如使用ado 对象的PageSize 这些属性,按记录总数计算页,然后跳转记录集再输出;也有编写存储过程实现分页数据,这些方面各有优缺点,以下本人介绍一种应用实际项目中速度非常快的分页算法;

关键点:SQL (用TOP 和 自动编号 实现)
页面脚本 (浏览器回退功能)

环境:
IIS/SQL Server/Access
表结构:
create table 内容表 (
自动编号 IDENTITY(int, 1,1) not null,
分类编码 varchar(20) null,
标题 varchar(255) NULL,
内容 varchar(4000) null,
时间 datetime null,
)

实现原理:
这个表设定了自动编号字段,这个字段的特性就是生成不重复的整形,包括删除了记录后该字段仍然保持‘流水性’(注:通常在系统表建设中,这种字段的运用很少,因为编号不能自由管理,但在这里使用它,主要是想在文章中省略编号维护的代码)。

分页:
那么第一步,就是查询一个页的数据;如果有100笔记录,按20记录一页,那么通常的分页算法就是“页总数=总记录 除 分页的控制数 [有余数的话,页总数加一]”,这样的做法就导致必须产生所有记录的一个大记录集;从而,又有人提出了用存储过程的分页算法,前者是asp 脚本产生大记录集,这样速度相当慢,后者是杀鸡用牛刀,虽然我经常写存储过程,但根据我的思路会发现写存储过程完全多余。

在SQL 中,许多刚接触它的朋友都知道 Top 修饰关键字的作用;例如:select TOP 1 * from table1 --这样就实现从Table1表返回只有一条记录的记录集那么分页优化的最终目的就是避免产生过大的记录集,通过TOP 即可完全控制;现在查询表应该是 select Top 20 自动编号,标题,内容,时间 from 内容表。

但现在还有个问题,就是如何定位,Top 不可能自动给我们定位输出某个页,这就设计到了where 从句,根据一个特定条件输出正确的内容;注意:记录的 order by 排序是非常重要的,这个决定了这个算法的成败;

这里的演示是DESC 方式,倒序排列,比如网站的软件更新,就是最近的更新放最前面,而这个就是倒序方式。

OK,下面来看看实际代码,首先要确定是否为起始页。


dim strSQL,i,endID,isBeginPage
const Cnt_PageSize = 20 '定义每页记录的大小
'通过检查浏览器传递的Page 参数的值来判断是否为进入下一页的操作
isBeginPage = isEmpty(request("Page")) or request("Page")="" or request("Page")<>"next"
'这里是分页的核心
if isBeginPage then '如果是起始页
'查询=列出分类编码等于参数flbm 的记录,按倒序排列,并只列出前 Cnt_PageSize 笔 (Cnt_PageSize是常量定义,比如20)
strSQL = "select TOP " & Cnt_pageSize & " 自动编号,标题,内容,时间 from 内容表 where 分类编码= '" & TRIM(SQLEncode(request("flbm"))) & "' order by 自动编号 desc"
else '如果不是起始页
if request("Page")="next" then '这里这样写是为了加强代码的表现,如果参数为next ,则表示取下页内容
'查询=列出分类编码等于参数flbm的记录并且要小于自动编号endID (endID也是参数),并倒序排列,并只列出前 Cnt_PageSize 笔 (Cnt_PageSize是常量定义,比如20)
strSQL = "select TOP " & Cnt_pageSize & " 自动编号,标题,内容,时间 from 内容表 where 分类编码= '" & TRIM(SQLEncode(request("flbm"))) & "' and 自动编号<" & request("endID") & " order by 自动编号 desc"
End if
end if

'打开数据连接执行SQL 并建立记录集
set rs = Cnn.Execute(strSQL)
if not rs.Eof then '这里写入判断是否为Eof 可以不要,但是,在这里却有它的特殊意义
call TableTitle '这里是自写的函数,用于建立表格标记
call beginTr '这里是建立表格tr标记

for i=0 to rs.fields.Count-1 '遍历记录集字段
call AddCol(rs(i).name) '输出字段名
Next

call endTr

while not rs.eof '循环记录集内容,并输出
call beginTr

for i=0 to rs.fields.Count-1
call AddRow(ASPEncode(rs(i).value))
Next
call endTr
endID = rs("自动编号") '这里保存每次输出的自动编号值
rs.MoveNext
Wend
call TableBottom '到此为止,就简单的将记录集内容全部输出
'这里输出翻页标记,vbaIIF 是自写函数
原型为 function vbaIIF(a,b,c)
if a then
vbaIIF =b
else
vbaIIF =c
end if
end function

上一页的实现是通过脚本调用浏览器的功能 history.back(1) 实现,那么回页时并不需要在服务器端重新生成数据,速度不用考虑了。
在首页的时候,上一页的链接应该是无效的,通过 vbaIIF(isBeginPage,"disabled","") 实现,如果为首页,那么在标记中加入 disabled 属性 ,如果不是首页,则加入history.back(1); 脚本指令,用于回退浏览页。
下一页是传递Page 参数和endID参数,Page 设置为 next 表示为下一页的动作,endID 表示当前记录集的末尾编号,下页将由此分页。

response.Write("〈a href=""#"" onclick=""javascript:" & vbaIIF(isBeginPage,"","history.back(1);") & """ " & vbaIIF(isBeginPage," disabled ","") & "〉上一页〈/a〉|〈a href=""TypeOptions.asp?flbm=" & request("flbm") & "&Page=next&endID=" & endID & """〉下一页〈/a〉")
else
'这里通过判断记录集是否为空来解决到末尾页还可以继续翻页的问题
if not isBeginPage then
'判断是否为空记录,并且不是起始页,那么生成回退页面的脚本,效果就是进入该页后将自动返回到上页。
response.Write "〈Script language=javascript〉" & vbCrlf
Response.Write "history.back(1);" & vbCrlf
Response.Write "〈/script〉"
Response.End
else '如果是起始页记录就为空,则提示无内容
Response.Write "〈font color=blue〉该类别下无内容〈/font〉"
end if
end If


总结:通过前台脚本,SQL查询技巧,实现高性能的分页程序简单快速

希望同行提出更优秀实时数据分页算法

备注:由于论坛限制了HTML字符,所以关键符号采用了中文大写。

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本