数据的分页是我们再熟悉不过的功能了,各种各样的分页方式层出不穷。今天我把一些常见的存储过程分页列出来,再简单地测一下性能,算是对知识的总结,也是对您好想法的抛钻引玉。废话不多说,开始吧~~

1.首先建立一张测试表

--创建测试表
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[testTable]([id] [int] IDENTITY(1,1) NOT NULL,[testDate] [datetime] NOT NULL CONSTRAINT [DF_testTable_testDate]  DEFAULT (getdate()),[name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,[description] [nchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,[orderColum] [float] NOT NULL,CONSTRAINT [PK_testTable] PRIMARY KEY CLUSTERED
([id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

2.循环插入1000000条测试数据

declare @i int
set @i = 1
while @i < 1000001
beginINSERT INTO testTable([name],[description],[orderColum])VALUES('PageTest', 'http://www.3ymao.com', @i * rand())set @i = @i + 1
end

3.晒出我的系统硬件和软件(测试环境)

好吧,准备工作完成,开始进入主题(为了方便,以下代码我就不写成存储过程的方式来测试展示了)~~噔噔!首先登场的是我最常用的Not IN

1)NOT IN

declare @timediff datetime
declare @pageIndex int
declare @pageSize int
declare @sql varchar(500)
set @pageIndex=1
set @pageSize=10
set @timediff=GetDATE()
set @sql='select top ('+cast(@pageSize as varchar)+') * from testTable where (id not in (
select top '+cast(@pageSize*(@pageIndex-1) as varchar)+' id from testTable order by id)) order by id'
exec(@sql)
select datediff(ms,@timediff,Getdate())

@pageIndex=1时,运行:0ms(给力啊!)

@pageIndex=50000时,运行:346ms(怎么50000页就不给力了)

@pageIndex=100000时,运行:326ms(怎么比50000页时还少了?)

2)MAX()

declare @timediff datetime
declare @pageIndex int
declare @pageSize int
declare @sql varchar(500)
set @timediff=GetDATE()
set @pageIndex=1
set @pageSize=10
set @sql='select top ('+cast(@pageSize as varchar)+') * from testTable where (id >= (select MAX(id) from (select top '+cast((@pageSize*(@pageIndex-1)+1) as varchar)+' id from testTable order by id) as a)) order by id'
exec(@sql)
select datediff(ms,@timediff,Getdate())

@pageIndex=1时,运行:0ms(也是很给力啊!)

@pageIndex=50000时,运行:123ms(不错)

@pageIndex=100000时,运行:220ms(页数和查询时间成正比)

3)Row_Number()

declare @timediff datetime
declare @pageIndex int
declare @pageSize int
declare @sql varchar(500)
set @timediff=GetDATE()
set @pageIndex=1
set @pageSize=10
set @sql='select * from (select *,row_number() over (order by id asc) as RowIndex from testTable) as IDWithRowNumber where RowIndex between '+cast(((@pageIndex-1)*@pageSize)+1 as varchar)+' and '+cast(@pageIndex*@pageSize as varchar)+''
exec(@sql)
select datediff(ms,@timediff,getdate())

@pageIndex=1时,运行:0ms(好吧……数据量小的时候都是这尿性)

@pageIndex=50000时,运行:280ms(略逊色)

@pageIndex=100000时,运行:580ms(这货居然也是页数和查询时间成正比!坑爹吧!)

4)临时表

declare @timediff datetime
declare @pageIndex int
declare @pageSize int
declare @sql varchar(500)
declare @str varchar(500)
set @timediff=GetDATE()
set @pageIndex=1
set @pageSize=10
set @str='with tempTable as (select ceiling((Row_number() over (order by id asc))/'+cast(@pageSize as varchar)+') as page_num,* from testTable)'
set @sql=@str+'select * from tempTable where page_num='+cast(@pageIndex-1 as varchar)+''
exec(@sql)
select datediff(ms,@timediff,getdate())

@pageIndex=1时,运行:280ms(不咧个是吧!这非主流啊)

@pageIndex=50000时,运行:280ms(这不科学……)

@pageIndex=100000时,运行:280ms(好吧,这货不受页数的影响,永远都这速度)

5)中间变量

declare @timediff datetime
declare @pageIndex int
declare @pageSize int
declare @count int
declare @id int
declare @sql varchar(500)
set @pageIndex=1
set @pageSize=10
select @id=0,@count=0,@timediff=GetDATE()
select @count=@count+1,@id=case when @count=(@pageIndex-1)*@pageSize then id else @id end from testTable order by id
set @sql='select top '+cast(@pageSize as varchar)+' * from testTable where id>'+cast(@id as varchar)+''
exec(@sql)
select datediff(ms,@timediff,getdate())

@pageIndex=1时,运行:360ms(哥,不是吧,才第一页你就这速度)

@pageIndex=50000时,运行:360ms(我大概猜到100000页时的速度了……)

@pageIndex=100000时,运行:360ms(好吧,又是不受页数影响的货)

从以上数据,我最后简单分析总结一下:

NOT IN:数据量小的时候,速度不错,但是数据量大的时候速度就有点逊色了,但是好在随着查询页数增大,他的速度还是不会改变多少。

MAX:小数据量的时候,它的速度是最快的,但是遗憾的是查询页数越大,速度则越慢。

Row_Number():性质与MAX相似,但是不比MAX速度快

临时表:不会因为查询页数而改变查询速度,只和数据量大小有关,个人觉得适合大数据量而且可能会查很大的页数时使用

中间变量:性质和临时表相似,但是逊色于临时表

转载于:https://www.cnblogs.com/yangyy753/archive/2013/01/23/2872753.html

常见存储过程分页PK赛——简单测试分析常见存储过程分页速度相关推荐

  1. java access 分页查询语句,简单又高效的Access分页语句

    Access实现分页其实也可以在查询语句里面做. 除了流行的top分页法之外,其实还有一种更简单,更容易理解,并且效率也不低的分页法. 先来一段传统的top分页法. SELECT TOP 10 * F ...

  2. 使用bootstarp前端组件集成的table 分页组件 ;简单上手使用实现前端分页功能

    文章目录 1. 下载bootstarp 2. 下载使用 bootstrap-table 3.部分代码 4.具体效果 注意这是前端分页实现哦, 在后端会一次性把数据取过来的,慎用啊

  3. HDMI符合性测试的常见失败分析

    自从几年前HDMI标准发布以来,它已经获得了广泛的应用.为了贴上HDMI的标志,所有的HDMI产品必须通过HDMI符合性测试(HDMI CT).为了节省时间和金钱,消费者们应该在把产品送往授权测试中心 ...

  4. Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询

    Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开 ...

  5. 移动app测试的多样性_web测试与移动App测试的常见测试要点

    手机APP项目测试点(内容)总结 对于手机项目(应用软件),主要是进行系统测试. 而针对手机应用软件的系统测试,我们通常从如下几个角度开展测试工作: 功能模块测试 交叉事件测试 性能测试 安全测试 容 ...

  6. 高效的敏捷测试第十一课 敏捷测试分析、策略和方法

    第26讲:基于上下文驱动思维的测试分析 从这一讲开始,我们就进入了第 5 部分内容的学习:敏捷测试分析与计划.在这一部分你将学到:测试需求分析.测试风险的识别.测试策略及测试计划的制定.今天先从基于上 ...

  7. python 数据逐个验证_案例实战 | Python 实现 AB 测试中常见的分层抽样与假设检验 (附代码和数据集)...

    在这里插入图片描述 作者 l 萝卜 本文会将原理知识穿插于代码段中,相关代码和数据集可在公众号 " 数据分析与商业实践 " 后台回复 " AB测试 " 获取. ...

  8. NLTK学习之一:简单文本分析

    nltk的全称是natural language toolkit,是一套基于python的自然语言处理工具集. 1 NLTK的安装 nltk的安装十分便捷,只需要pip就可以. pip install ...

  9. CentOS7设置静态IP、搭建单机版FastDFS图片服务器、使用FastDFS-Client客户端进行简单测试、实现图片上传、实现商品添加修改删除

    CentOS7设置静态IP.搭建单机版FastDFS图片服务器.使用FastDFS-Client客户端进行简单测试.实现图片上传.实现商品添加修改删除 CentOS7设置静态IP而且还可以上网 192 ...

最新文章

  1. android 在设备上安装apk包
  2. BZOJ2331:[SCOI2011]地板——题解
  3. 吴恩达家免费 NLP 课程重磅上线!110 个小视频教你做出聊天机器人,粉丝:我要让娃跟吴恩达姓!...
  4. 在linux下创建自定义service服务
  5. 伯努利数(详解 + 例题 :P3711 仓鼠的数学题)
  6. 创新 - 王屋村的魔方们
  7. ajax 刷新output,JSF生命周期及AJAX局部刷新
  8. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress
  9. package--math
  10. asp.net优化方案
  11. 微软半日游,和CSDN同学们走进名企
  12. 整理了25个Python文本处理案例,收藏!
  13. PG如何影响数据分布
  14. 用PV操作写出一个不会出现死锁的哲学家进餐问题
  15. Phonetic symbol 辅音 - 清辅音 -- /f/
  16. java-day24
  17. ABP VNext学习日记15
  18. 1.4_6 Axure RP 9 for mac 高保真原型图 - 案例5 【旋转的唱片3】进度条_滚动
  19. 网络性能测试中CHARIOT脚本参数配置对测试数据的影响
  20. FL Studio 21官方中文版如何终身免费升级及如何插入第三方插件

热门文章

  1. 自己架设windows升级服务器
  2. Swift 中 10 个震惊小伙伴的单行代码
  3. Robot Framework(十八) 支持工具
  4. 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)
  5. node.js学习5--------------------- 返回html内容给浏览器
  6. centos7中nfs文件系统的使用
  7. TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
  8. 利用TensorFlow实现多元线性回归
  9. dmalloc 原文 翻译整理
  10. Exchange 2013防止数据丢失DLP预览