ITKeyword,专注技术干货聚合推荐

注册 | 登录

Sql Server 2005 row_number()分页性能测试

pcajax 分享于

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1073

【阿里云】双十一活动,全年抄底价,限时3天!(老用户也有),
入口地址https://www.aliyun.com/1111/home

推荐:SQL Server 软件测试中数据库的性能优化

设计一个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事。在开发工具、数据库设计、应用程序的结构、查询设计、接口选择等方面有多种选

现在分页方法大多集中在select top/not in/游标/row_number,而select top分页(在这基础上还有二分法)方法似乎更受大家欢迎,这篇文章并不打算去讨论是否通用的问题,本着实用的原则,花了一些时间去测试row_number()分页的性能,感觉并不像一部分人所说的那么鸡肋,由于接触软件开发才十个月,方方面面的东西都要学,经验实在有限,不足之处请原谅,测试如下: 平台与环境: CPU:AMD 1150 2G 单核 内存:1G(系统正常启动后约占300M空间) 硬盘:SATA 160G 8M Cache 系统:windows 2003 ent+Sql Server 2005 sp2 数据:共500万条 ------------------------------------------------------------------- 测试数据: create table test_table ( id

int identity(1,1) primary key not null, cid

int

not null, userName

varchar(50) null, userPwd

varchar(50) null, createTime datetime null ) --------------------------------------------------------------------- 插入记录(cid分别插入1,2,3,4,机器实在太慢,总共只插入500万条): declare @count int set @count=1 while @count<=1000000 begin insert into test_table(cid,userName,userPwd,createTime) values(2,'admin','admin888',getdate()) set @count=@count+1 end ------------------------------------------------------------------------------------------------------- 分页测试代码: 这里采用row_number的两种分页方式:分别用top和between过滤 /*row_number() 查询方法一*/ declare @tdiff datetime set @tdiff=getdate() select top 20 * from(select row_number() over(order by createtime desc,id asc) as rownumber,* from test_table ) as tb where rownumber>120000 select datediff(ms,@tdiff,getdate()) as '耗时(毫秒)' /*row_number() 查询方法二*/ declare @tdiff datetime

set @tdiff=getdate() select * from(select row_number() over(order by createtime desc,id asc) as rownumber,* from test_table ) as tb where rownumber between 120000 and 120200 select datediff(ms,@tdiff,getdate()) as '耗

推荐:使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较

相比在SQL Server 2000

中使用的分页方式,在 SQL Server 2005 中使用新的语法 ROW_NUMBER() 来分页效率要高出很多,但是很多人在使用 ROW_NUMBER() 这种分页

时(毫秒)' ---------------------------------------------------------------------------------------------------------- 测试方法及结果(取三次平均值): 第一次测试,每页显示20条(单位:毫秒): 索引1(聚集) id asc 索引2(非聚集) createtime desc 页次

方法1

方法2 1

0

0 10

0

0 100

10

10 1000

65

70 1W

530

546 10W

4500

4700 20W

9.5秒

9.7秒 --------------------------------------- 第二次测试,每页显示20条(单位:毫秒): 索引1(聚集) id asc 索引2(非聚集) createtime desc,包含性列:cid,userName,userPwd 页次

方法1

方法2 1

0

0 10

0

0 100

0

0 1000

13

16 1W

240

250 10W

2240

2260 20W

4436

4481 ----------------------------------------------------------------------------------------------------------------------------------------- 总结及个人观点: 由于表内记录具有一定规律性和查询的不确定性,在实际操作中,查询时间会比以上数据长,查询结果仅做参考。 1.top过滤要稍优于between过滤 2.在分页至10W即第200W第记录时,查询已经要2秒以上,个人机器原因,稍微好点的电脑查询速度可能可以提高到1秒以内。 3.分页查询的效率更重要的是取决于根据程序对数据库的优化,如索引的正确建立,分区等因素(还在学习和研究中...) 3.如果是海量级数据,其实转变一下思路也未尝不可,按用户的浏览习惯几乎不会翻到千页以后,个人感觉只要前1000页分页效率能接受就可以,测试1千页以后的效率有些多余,前台完全只需要呈现前几百页即可(如博客园只展示前200页(目前随笔数 568234),淘宝只展示前100页),按测试的row_number效率。完全可以胜任。

评价: row_number分页除了节省代码外,没什么优点可言,还不如select top方式,更不用说二分法等。 你就分析下row_number写法就明白了。 select * from ( select *,row_number(order by ** desc) as yy from XXXX )m where yy between 1 and 20

先把整个表符合条件的数据都取出来放在一个临时表中,建立行号,然后再select.试问速度能快么??? 

推荐:从SQL Server 2000/2005到SQL Server 2008的升级测试

本文部分内容摘自《SQL Server 2008管理实战》,人民邮电出版社;《深入MSSQL 2008升级和应用程序的兼容性》,IT专家网;《SQL Server 2008联机丛书》 ,主要整

   现在分页方法大多集中在select top/not in/游标/row_number,而select top分页(在这基础上还有二分法)方法似乎更受大家欢迎,这篇文章并不打算去讨论是否通用的问题,本着实用的原则,花了一

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。