热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer分页控件优化:高效分页算法详解

两个分页算法,第一个分页算法只适用于SQL Server ,第二个分页算法Access也能用。速度还是比较快的,基本上几十毫秒就可以搞定。至于是不是写成存储过程的形式,看个人的习惯了,我是在程序里面组

两个分页算法,第一个分页算法只适用于SQL Server ,第二个分页算法Access也能用。
速度还是比较快的,基本上几十毫秒就可以搞定。
至于是不是写成存储过程的形式,看个人的习惯了,
我是在程序里面组合sql语句,并且封装到了分页控件里面,这样就方便多了,尤其是在多查询条件和算法升级的时候。


上两篇随笔:
我的分页控件(未完,待续)——控件件介绍及思路

我自己写的一个分页控件(源码和演示代码)PostBack分页版 for vs2003、SQL Server

关于分页的误区
    误区1:分页的时候,只有使用存储过程,效率才高。
    误区2:忽略了索引的作用。

上两篇好像介绍的不太详细,这里详细说明一下分页控件里使用的分页算法,也就是SQL语句。

分页一般分为四种情况

1、单字段排序,排序字段没有重复值。
2、单字段排序,排序字段有重复值。
3、多字段排序,最后一个排序字段没有重复值。
4、多字段排序,最后一个排序字段有重复值。

其中第2、4 情况都可以再加一个排序字段(比如说主键),就可以转换成第三种情况。

所以分页针对1、3两种情况设置了两种分页算法。

1、单字段排序,排序字段没有重复值。

    公式:

 1分页控件之分页算法 —— for SQL Server 版。 - 文章图片declare @col int
 2分页控件之分页算法 —— for SQL Server 版。 - 文章图片
 3分页控件之分页算法 —— for SQL Server 版。 - 文章图片select top {PageSize * (PageIndex-1)+1} @col = [排序字段] 
 4分页控件之分页算法 —— for SQL Server 版。 - 文章图片from [表名|视图名] 
 5分页控件之分页算法 —— for SQL Server 版。 - 文章图片[ where 查询条件 ] 
 6分页控件之分页算法 —— for SQL Server 版。 - 文章图片order by [排序字段] asc|desc
 7分页控件之分页算法 —— for SQL Server 版。 - 文章图片
 8分页控件之分页算法 —— for SQL Server 版。 - 文章图片select top PageSize 需要显示的字段 
 9分页控件之分页算法 —— for SQL Server 版。 - 文章图片from [表名|视图名] 
10分页控件之分页算法 —— for SQL Server 版。 - 文章图片where [排序字段] >= @col
11分页控件之分页算法 —— for SQL Server 版。 - 文章图片[ and 查询条件 ]
12分页控件之分页算法 —— for SQL Server 版。 - 文章图片order by [排序字段] asc|desc


    以NorthWind 数据库里的 Products 表为例,假设一页显示10条数据,CategoryID = 3 为查询条件,按照ProductID 倒序,如果想显示第二页的数据,那么SQL语句就是
    

分页控件之分页算法 —— for SQL Server 版。 - 文章图片declare @col int
分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片select top 11 @col = ProductID from Products where CategoryID = 3 order by ProductID desc    
分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片select top 10 * from Products where ProductID >= @col and CategoryID = 3 order by ProductID desc    


   说明:
    第一行的定义,要根据字段类型来修改,看是比较麻烦,但是这个麻烦交给分页控件就可以了,使用者,只要设置分页控件的属性就可以了。
    第五行和第十一行,如果需要加查询条件的话就可以在这里添加。

    第三行是一个“定位”,这个可以算是SQL Server 所特有的吧,也是SQL Server 很宽容的地方。以Products 表的例子,执行完第一条select 语句之后, @col 里面记录的是 在CategoryID = 3 的记录里面,按照ProductID 倒序,排行在11位的记录的值。
    
    第一个select 语句定位以后,第二个select 语句就可以根据这个“位置”继续向下查找数据了。

    虽然例子里面使用了ProductID(主键)来排序,但是并不是说这个算法只能用主键来排序,哪个字段都可以,但是要符合第一种情况,就是“只有一个排序字段,且排序字段里的记录没有重复值”!


3、多字段排序,最后一个排序字段没有重复值。

    如果 Products 表想要用 UnitPrice 字段来排序怎么办呢?上面的算法是不适合的,我们需要使用另一种算法,这个和颠颠倒倒法有些类似,但是我做了一些优化。

    公式:

分页控件之分页算法 —— for SQL Server 版。 - 文章图片select [需要显示的字段] from [表名|视图名] where [主键字段] in 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    ( select top PageSize [主键字段] from 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片        (select top {PageSize * PageIndex} [主键字段] , [排序字段] from     --有几个排序字段就写几个字段
分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            [表名|视图名] 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            [ where 查询条件 ] 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            order by 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                [排序字段1] asc|desc ,
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                [排序字段2] desc|asc, 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                分页控件之分页算法 —— for SQL Server 版。 - 文章图片分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                [主键字段] asc|desc     
分页控件之分页算法 —— for SQL Server 版。 - 文章图片        ) as aa     
分页控件之分页算法 —— for SQL Server 版。 - 文章图片        order by     
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            [排序字段1] desc|asc,        --如果上面是倒序,那么这里就是正序,下同
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                [排序字段2] asc|desc ,
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                    分页控件之分页算法 —— for SQL Server 版。 - 文章图片分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                    [主键字段] desc|asc 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    ) 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片order by 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    [排序字段1] asc|desc,    --如果上面是倒序,那么这里就是正序,所谓颠颠倒倒嘛。
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    [排序字段2] desc|asc,
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    分页控件之分页算法 —— for SQL Server 版。 - 文章图片分页控件之分页算法 —— for SQL Server 版。 - 文章图片
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    [主键字段] asc|desc


    以NorthWind 数据库里的 Products 表为例,假设一页显示10条数据,CategoryID = 3 为查询条件,按照UnitPrice 倒序,由于UnitPrice 字段可能有重复值,所以加上一个排序字段——ProductID ,即按照 UnitPrice  desc,ProductID  来排序。 如果想显示第二页的数据,那么SQL语句就是

分页控件之分页算法 —— for SQL Server 版。 - 文章图片select * from Products where ProductID in 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    ( select top 10 ProductID from 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片        (select top 20 ProductID , UnitPrice from     
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            Products 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            where CategoryID = 3
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            order by 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                UnitPrice desc ,
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                ProductID      
分页控件之分页算法 —— for SQL Server 版。 - 文章图片        ) as aa     
分页控件之分页算法 —— for SQL Server 版。 - 文章图片        order by     
分页控件之分页算法 —— for SQL Server 版。 - 文章图片            UnitPrice asc,        --如果上面是倒序,那么这里就是正序,下同
分页控件之分页算法 —— for SQL Server 版。 - 文章图片                ProductID desc 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    ) 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片order by 
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    UnitPrice desc,    --如果上面是倒序,那么这里就是正序,所谓颠颠倒倒嘛。
分页控件之分页算法 —— for SQL Server 版。 - 文章图片    ProductID 


    说明:
    1、这里查询条件加一次就可以了。
    2、是不是看 asc|desc 倒来倒去的有点晕,恩,这就对了,颠颠倒倒嘛。
    3、最主要的就是第三个select 语句,他要取从第一条数据到要显示的页的数据,可见越是后面的记录,top n 就会越大,所以这里提取的数据就要做一个精简,只写排序需要的字段(主键字段和排序字段)。
    4、第二个select 语句是去掉前面不需要的页里的数据,只保留要显示的页号里的数据。
    5、第一个select 语句,用主键字段 in () 的方式提取其他需要的字段。
    6、这种分页算法有一个小的bug,就是显示最后一页数据的时候,会多出来几条记录,不过这个bug已经在分页控件里面修正了,最后一页的分页算法,采用特殊的select语句。
    7、效率,设置好索引,效率是没有问题的,上一篇随笔已经测试过了。
    8、这种算法有一个“侵入性”,就是要求表必须有主键,而且不能是联合主键,引为要用 in 的方式查询数据。但是并没有要求主键自身必须能够排序。

测试效果
记录数:2523136条。
一页显示5条记录。

//分页算法1 单字段排序,且排序字段是聚集索引。
   //1000 页以内 15毫秒
   //10000页以内 30毫秒
   //50000页以内 100多毫秒
   //100000页以内 200多毫秒
   //最后几页 第一次跳转到 4秒多
   //最后几页 连续向前翻页 1秒156毫秒

   //页号大范围跳转的时候需要的时间比较长,但是也小于1秒,同时SQL Server 占用的内存有所增加 120M。最后几页时达到320M

===================================================================
以下是多排序字段的分页情况,排序字段是 UnitPrice,ProductID  

   //分页算法2 无索引  首页 8秒187毫秒 。 
   //10 页以内 2秒812毫秒
   //速度太慢下面的就不测试了

   //分页2 非聚集索引 UnitPrice  首页 468毫秒
   //10 页以内 2秒671毫秒
   //速度太慢下面的就不测试了

   
   //分页算法2 非聚集索引 UnitPrice,ProductID  首页 500毫秒
   //10 页以内 2秒796毫秒
   //100页以内 4秒796毫秒
   //速度太慢下面的就不测试了

   
   //分页算法2 非聚集索引 UnitPrice,ProductID desc  首页 500毫秒
   //10 页以内 0-15毫秒
   //100页以内 15-46毫秒
   //1000页以内 31-62毫秒
   //10000页以内 100毫秒左右
   //50000页以内 400-500毫秒
   //100000页以内 900毫秒左右
   //最后几页 第一次跳转到 4秒421毫秒
   //最后几页 连续向前翻页 4秒375毫秒

   //页号大范围跳转的时候需要的时间比较长,但是也小于1秒,
   //这回SQL Server 占用的内存增加幅度不大 120M左右






推荐阅读
  • Java 零基础入门:SQL Server 学习笔记(第21篇)
    Java 零基础入门:SQL Server 学习笔记(第21篇) ... [详细]
  • 浅析PHP中$_SERVER[
    在PHP后端开发中,`$_SERVER["HTTP_REFERER"]` 是一个非常有用的超级全局变量,它可以获取用户访问当前页面之前的URL。本文将详细介绍该变量的使用方法及其在不同场景下的应用,如页面跳转跟踪、安全验证和用户行为分析等。通过实例解析,帮助开发者更好地理解和利用这一功能。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • HBase在金融大数据迁移中的应用与挑战
    随着最后一台设备的下线,标志着超过10PB的HBase数据迁移项目顺利完成。目前,新的集群已在新机房稳定运行超过两个月,监控数据显示,新集群的查询响应时间显著降低,系统稳定性大幅提升。此外,数据消费的波动也变得更加平滑,整体性能得到了显著优化。 ... [详细]
  • Python学习:环境配置与安装指南
    Python作为一种跨平台的编程语言,适用于Windows、Linux和macOS等多种操作系统。为了确保本地已成功安装Python,用户可以通过终端或命令行界面输入`python`或`python3`命令进行验证。此外,建议使用虚拟环境管理工具如`venv`或`conda`,以便更好地隔离不同项目依赖,提高开发效率。 ... [详细]
  • 从Google Jam落选后,意外收获了一颗“桔子”,重新整理行囊再出发 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 抖音AI特效风靡网络,真人瞬间变身动漫角色,吴亦凡、PDD和戚薇纷纷沉迷其中
    近期,抖音推出的一款名为“变身漫画”的AI特效在社交媒体上迅速走红,吸引了大量用户尝试。不仅普通网友积极参与,连吴亦凡、PDD和戚薇等明星也纷纷加入,体验将真人瞬间转化为动漫角色的神奇效果。这一特效凭借其高度的趣味性和创新性,迅速成为网络热议的话题。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 全面解析:Hadoop技术栈中的Linux操作系统概览
    全面解析:Hadoop技术栈中的Linux操作系统概览 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
author-avatar
ltl3265164
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有