前段时间一直被公司后台数据翻页卡顿的问题困扰,因为数据量比较大,使用的是Adodb的Recordset对象进行数据遍历。
当时猜测是由于Recordset每次都读取了所有数据,并且每次翻页都刷新了页面,没有利用Recordset的缓存优势进行翻页,所以导致数据加载非常慢。

解决办法:

1. Recordset + JS无刷新翻页

使用Recordset方式,由于是因为Recordset的缓存没有得到有效的利用导致的卡顿,所以每次翻页时不进行刷新操作,使用JS进行数据翻页(首次读取时,已经遍历出所有页,使用JS控制显隐)

由于首次会遍历出所有数据,所以首次加载会很慢,并且占用不必要的内存;但是后续翻页会极快。

2. 通过标识列进行数据筛选

因为我们的数据表存在标识列,并且不涉及到数据删除以及修改,所以可以使用ID进行数据筛选

例如:
PageSize:10
Page 1: ID BetWeen 1 AND 11
Page 2: ID BetWeen 2 AND 21
Page X: ID BetWeen X And X*10+1

这种方案因为需要标识列的连续性,所有使用场景有限制。但是性能极佳,在可能情况下,还是推荐使用这种方式。

3. 通过数据库进行分页

在SQLSERVER建立存储过程,通过存储过程将查询后的结果进行筛选后返回至业务端。

这种方式适用范围广,对数据的连续性、完整性没什么要求,查询效率也挺高,所以大部分人都选用存储过程分页。最主要是使用存储过程的话,便于维护。

示例代码

CREATE PROCEDURE [dbo].[queryDataByPage]
(@TableName nvarchar(4000),@ColumnName nvarchar(4000),@Where nvarchar(4000),@OrderBy nvarchar(4000),@PageSize int,@PageIndex int,@TotalCount int output
)
AS
BEGINDeclare @SQLString nvarchar(4000), @Total nvarchar(4000)Set @SQLString = 'Select *From (SelectRow_Number() Over ( Order By ' + @OrderBy + ' ) As RowNumber,  P.*From(Select ' + @ColumnName + 'From ' + @TableName + 'Where' + @Where + ') P) As NewTable WhereRowNumber BetWeen ' + str(@PageIndex * @PageSize + 1) + ' And ' + str((@PageIndex + 1) * @PageSize)Set @Total = 'Select @TotalCount = Count(*) From ( Select ' + @ColumnName + ' From ' + @TableName + ' Where ' + @Where + ' ) P 'Exec sp_executesql @Total,N'@TotalCount int output',@TotalCount outputExec sp_executesql @SQLString
END
<%
'''''''''''''''''''''''''''''
'      数据库分页
'使用SQLSERVER存储过程进行分页
'传入参数
'@TableName       数据表名
'@ColumnName  列名
'@Where       查询条件
'@PageSize        页大小
'@PageIndex       页码
'@OrderBy     排序
'执行完成后,返回一个Recordset对象
'以及一个全局变量strTotalCount
'      @LiuGang
'''''''''''''''''''''''''''''Dim strTotalCount
strTotalCount = 0Class SQLPageClassPrivate strTableNamePublic Property Let setTableName(ByVal strVar)strTableName = strVarEnd PropertyPrivate strColumnNamePublic Property Let setColumnName(ByVal strVar)strColumnName = strVarEnd PropertyPrivate strWherePublic Property Let setWhere(ByVal strVar)strWhere = strVarEnd PropertyPrivate strPageSizePublic Property Let setPageSize(ByVal strVar)strPageSize = strVarEnd PropertyPrivate strPageIndexPublic Property Let setPageIndex(ByVal strVar)strPageIndex = strVarEnd PropertyPrivate strOrderByPublic Property Let setOrderBy(ByVal strVar)strOrderBy = strVarEnd PropertyPrivate strProcedureNamePublic Property Let setProcedureName(ByVal strVar)strProcedureName = strVarEnd PropertyPublic Property Get VersionVersion = strVersionEnd PropertyPublic Property Get AuthorAuthor = strAuthorEnd Property'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''                   分页查询参数Dim CmdSP,adoRS,adCmdSPStoredProc,adParamReturnValue,adParaminput,adParamOutput,adInteger,adoField,adVarChar,adLongVarChar''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Private Sub Class_Initialize()strAuthor = "LiuGang"strVersion = "v1.0"'这些值在 VB 中是预定义常量,可以直接调用,但在 VBScript 中没有预定义adCmdSPStoredProc = 4adParamReturnValue = 4adParaminput = 1adParamOutput = 2adInteger = 3adVarChar = 200adLongVarChar = 201End SubPublic Function PageToRecordSet(strConnectionObject,strRecordSet)Set CmdSP = Server.CreateObject("ADODB.Command")                                                          '建一个command对象CmdSP.ActiveConnection = strConnectionObject                                                             '建立连接CmdSP.CommandText = strProcedureName                                                                     '定义command 对象调用名称CmdSP.CommandType = adCmdSPStoredProc                                                                        '设置command调用类型是存储过程 (adCmdSPStoredProc = 4)CmdSP.Parameters.Append CmdSP.CreateParameter("@TableName", adVarChar, adParamInput, 4000, strTableName)CmdSP.Parameters.Append CmdSP.CreateParameter("@ColumnName", adVarChar, adParamInput, 4000, strColumnName)CmdSP.Parameters.Append CmdSP.CreateParameter("@Where", adVarChar, adParamInput, 4000, strWhere)CmdSP.Parameters.Append CmdSP.CreateParameter("@OrderBy", adVarChar, adParamInput, 2000, strOrderBy)CmdSP.Parameters.Append CmdSP.CreateParameter("@PageSize", adInteger, adParamInput, , strPageSize)CmdSP.Parameters.Append CmdSP.CreateParameter("@PageIndex", adInteger, adParamInput, , strPageIndex)CmdSP.Parameters.Append CmdSP.CreateParameter("@TotalCount", adInteger, adParamOutput, , 0)Set adoRS = CmdSP.ExecuteSet strRecordSet = adoRSEnd FunctionPrivate Sub Class_Terminate()adoRS.Close : Set adoRS = NothingstrTotalCount = CmdSP("@TotalCount")Set CmdSP.ActiveConnection = NothingSet CmdSP = NothingEnd SubEnd Class'调用示例
Set SqlPageClass = New SQLPageClass
With SqlPageClass
.setTableName = " TableName "
.setColumnName = " * "
.setWhere = " 1=1 "
.setPageSize = " 10 "
.setPageIndex = " 0 "
.setOrderBy = " Id Desc "
.setProcedureName = "[DataBaseName].[dbo].[queryDataByPage]"
End WithCall SqlPageClass.PageToRecordSet(ConnectionObj, Rs)
Response.Write Rs(0) & "<br/>"
Set SqlPageClass = Nothing
Response.Write strTotalCount & "<br/>"
'ASP使用Command对象操作SQLSERVER时,如果要取Output参数的话,一定要先关闭所有的Rs对象,才可以得到。
%>

ASP - 三种常用分页相关推荐

  1. 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.3 【增加了使用说明】

    ================================ 欢迎转载,但是请注明出处.本文出自博客园 .谢谢合作! ================================ 最新版本:V ...

  2. ASP.NET 数据分页第三篇 - 结合 Custom Control 处理 GridView 的 UI 呈现

     延续本系列前两篇帖子「ASP.NET 数据分页第一篇 - 探讨分页原理及 SQL Server 2005 的 ROW_NUMBER 函数」.「ASP.NET 数据分页第二篇 - 范例下载」,本系列的 ...

  3. Ext.grid.GridPanel + asp.net 数据分页

    Ext.grid.GridPanel + asp.net 数据分页 [转]http://www.cnblogs.com/tujiang/archive/2009/07/03/1516488.html ...

  4. 【开源】我的分页控件正式命名为QuickPager ASP.NET2.0分页控件

    分页控件正式命名为 QuickPager ASP.NET2.0分页控件 . 版本号:2.0.0.1 Framework:.net2.0 分页方式:PostBack .URL (暂时没有实现URL的分页 ...

  5. ASP.NET2.0 分页控件 PagerPro.dll (1.1.0 最新)

    快来瞧,快来看了啊,新出炉的ASP.NET分页控件,热乎啦! 最新的ASP.NET2.0分页控件,经过对样式的处理,现有None和Standard两种样式,可以自定义是否显示Page Count 和 ...

  6. asp和mysql分页代码

    <!--#include file="zheboconn.asp"--> <html xmlns="http://www.w3.org/1999/xht ...

  7. ASP.NET MVC分页实现

    ASP.NET MVC中不能使用分页控件,所以我就自己写了一个分页局部视图,配合PageInfo类,即可实现在任何页面任意位置呈现分页,由于采用的是基于POST分页方式,所以唯一的限制就是必须放在FO ...

  8. [Asp.net]AspNetPager分页组件

    引言 在基于Asp.net的内网系统中,分页功能是最常用的,用的最多的组件就是AspNetPager. AspNetPager 官网:http://www.webdiyer.com/aspnetpag ...

  9. Asp.Net 数据分页

    .Net 所使用的 ADO.Net较前身ADO在性能上有较大的提升,但是操作起来也较为繁琐,在 Asp 时代,对数据进行分页使用 RecordSet 的 PageSize 和 AbsolutePage ...

最新文章

  1. java 自带thread分析工具_java自带的jvm分析工具
  2. kali系统网络设置
  3. 总结开发Silverlight项目准则(转)
  4. boost::mp11::mp_third相关用法的测试程序
  5. GitHub Pages搭建属于自己的静态网站,并绑定个人域名
  6. 养鹿专辑二:恋鹿篇之枕着老婆的梦编程
  7. linux系统安装显卡驱动卡顿,关于Ubuntu16.04上N卡驱动导致滚动屏幕卡顿问题
  8. rocketmq 有哪些监控工具_Kafka和RocketMQ底层存储之那些你不知道的事
  9. 浅谈ASP.NET的内部机制(二)
  10. jsp中给div加背景_web前端入门到实战:详解css3如何给背景图片加颜色遮罩
  11. python垃圾分类图像识别算法_用算法帮上海大妈垃圾分类,扔错罚款!长点心吧你...
  12. 区块链教程Fabric1.0源代码分析配置交易-生成通道配置
  13. javascript实现blob流、base64,file、base64的互相转换
  14. [LeetCode] Binary Tree Level Order Traversal
  15. 用CPLEX写个数学模型就这么难?
  16. 本学期关于Android学习的总结
  17. 计算机装系统找不到硬盘,安装系统找不到硬盘怎么办
  18. 【LDO低压差线性稳压芯片的使用(LM1117)】
  19. 重新安装电脑系统,升级win10的系统经验总结
  20. 罗格斯大学电气与计算机工程专业怎么样,罗格斯大学计算机工程排行,千万得细心点听懂...

热门文章

  1. 【备注】【C42】《编写高质量代码:改善Python程序的91个建议》PDF
  2. 三硅醇辛基-笼形聚倍半硅氧烷cas444315-26-8|TrisilanolPhenylPOSS|分子式:C42H38O12Si7|分子量:931.35
  3. 使用visual studio code调试单个js文件
  4. shs三大框架的作用
  5. utils系列 python将jp2图像格式转为jpg可读格式
  6. Dos系统常用命令【案例---计算机快捷助手】
  7. python数据分析与挖掘实战 之笔记2
  8. python中subplot是什么意思_python中matplotlib中的subplot函数使用
  9. 大学生服务外包大赛之超新星教考分离系统学习路线以及参考资源
  10. 人工智能之随机森林算法项目实战