博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
常见存储过程分页PK赛——简单测试分析常见存储过程分页速度
阅读量:6983 次
发布时间:2019-06-27

本文共 3995 字,大约阅读时间需要 13 分钟。

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

1.首先建立一张测试表

--创建测试表SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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 intset @i = 1while @i < 1000001begin    INSERT INTO testTable([name],[description],[orderColum])    VALUES('PageTest', 'http://www.3ymao.com', @i * rand())    set @i = @i + 1end

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

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

1)NOT IN

declare @timediff datetimedeclare @pageIndex intdeclare @pageSize intdeclare @sql varchar(500)set @pageIndex=1set @pageSize=10set @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 datetimedeclare @pageIndex intdeclare @pageSize intdeclare @sql varchar(500)set @timediff=GetDATE()set @pageIndex=1set @pageSize=10set @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 datetimedeclare @pageIndex intdeclare @pageSize intdeclare @sql varchar(500)set @timediff=GetDATE()set @pageIndex=1set @pageSize=10set @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 datetimedeclare @pageIndex intdeclare @pageSize intdeclare @sql varchar(500)declare @str varchar(500)set @timediff=GetDATE()set @pageIndex=1set @pageSize=10set @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 datetimedeclare @pageIndex intdeclare @pageSize intdeclare @count intdeclare @id intdeclare @sql varchar(500)set @pageIndex=1set @pageSize=10select @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 idset @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

你可能感兴趣的文章
程序集信息设置.net
查看>>
分享:When.js 2.0.0 发布,Promises/A 的实现
查看>>
poj1578
查看>>
Build Release Blogs
查看>>
Vim案例两则
查看>>
函数式编程学习之路(一)
查看>>
Win7安装VC++6.0已知的兼容性问题的解决方法
查看>>
数据库连接oracle 10g rman 备份与恢复 之一
查看>>
asp.net开源CMS推荐
查看>>
Android实现自定义的 时间日期 控件
查看>>
查找删除Code First Entity Framework基本与最佳添加(add/create),删除(delete/remove),修改(update/modify)操作...
查看>>
fsetpos() fgetpos()详解
查看>>
javaScript之数组Array
查看>>
seajs 的研究二 -- 无题
查看>>
数据范围BZOJ 3209(花神的数论题-数位统计+1,被数据范围坑了)
查看>>
系统性能调优(5)----Java循环与字符串代码优化
查看>>
spring InitializingBean接口
查看>>
桥牌笔记-防止阻塞
查看>>
crudandroidandroid——CRUD(在上一篇博客的基础上)
查看>>
oracle的to_char中的fm
查看>>