现在分页方法大多集中在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 '耗时(毫秒)'
----------------------------------------------------------------------------------------------------------
测试方法及结果(取三次平均值):
第一次测试,每页显示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 2005 row_number()分页性能测试相关推荐

  1. Sql Server 2005 ROW_NUMBER 函数实现分页

    过去用SQL Server 2000分页的,大多都用到了临时表.SQL Server 2005 ROW_NUMBER 函数支持分页,性能据说也非常不错. Paging Records Using SQ ...

  2. Sql Server 2005自定义分页

    前面一篇随笔,我提到了Sql Server 2000的自定义分页,但是在sql server 2000中,要实现显示某一页,就返回那一页数据的效果的方法实在不尽人意.网上很多通用的分页存储过程,但看着 ...

  3. Microsoft SQL Server 2005 查询分页

    微软新的SQL Server 2005新增了数据库分页功能,以后再也用写复杂不灵活而低效率的分页存储过程. 新的数据库分页功能的核心是一个叫row_number的函数 具体如下: 返回结果集分区内行的 ...

  4. Sql Server 2005 存储过程分页

    Sql Server2005的一个新特性便是我等了很久的Row_Number(),以前用Oracle时用rownumber写分页存储过程很方便:) 下面是我做的一个小小的测试,测试我原来在sql se ...

  5. Sql Server 2005 中的row_number() 分页技术

    原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CREAT ...

  6. SQL Server 2005中的Row_Number分页

    早就听说了SQL Server 2005中的Row_Number分页了,但是一直就没认真理解这个Row_Number的含义.这两天实在是太忙了,但是还是坚持将这个弄明白了.在说分页之前还是来了解一下R ...

  7. ASP.NET 2.0在SQL Server 2005上自定义分页

    这篇文章讲述了如何利用SQL Server 2005的新特性来简单高效的实现分页.对于那些暂时还没用到SQL Server2005的人们,请看在大规模数据中的高效分页方法.如果需要,这篇文章会补上这里 ...

  8. SQL Server 2005 中行号的显示,分页

    下面介绍一个SQL Server 2005 中的新东东: ROW_NUMBER 返回结果集分区内行的序列号,每个分区的第一行从 1 开始. 语法: ROW_NUMBER ( )     OVER ( ...

  9. SQL Server 2005下的分页SQL

    其实基本上有三种方法: 1.使用SQL Server 2005中新增的ROW_NUMBER 几种写法分别如下: 1SELECT TOP 20 * FROM (SELECT 2   ROW_NUMBER ...

最新文章

  1. 大作文十大必背范文:五星级真题
  2. Linux服务器架设之时间同步服务器
  3. gitblit.cmd运行自动关闭
  4. 一个北京小网编从1000块起家的网络直销故事
  5. 【mmall】IDEA自动Make
  6. phpVX活码系统源码
  7. 创业期的软件开发管理(一)
  8. 【Java并发编程】16、ReentrantReadWriteLock源码分析
  9. Linux设备驱动01:Linux设备驱动概述
  10. 使用Fraps获取3D程序的FPS
  11. mysql分割字符串_mysql分割字符串
  12. excel中indirect函数使用方法和应用实例
  13. 数据分析之帕累托(贡献度)分析
  14. 玩转视频类信息流广告平台,投放技巧及运营思路看这里
  15. super-csv文档的部分翻译及基本使用
  16. Java实现 蓝桥杯 算法训练 相邻数对(暴力)
  17. 喜马拉雅FM抓包之旅
  18. 【漫画】各大互联网公司的真实“人”生
  19. 多波段影像 tif转为jpg(png)
  20. 免编程让你零基础制作App

热门文章

  1. 蜥蜴与地下室(51Nod-1489)
  2. 暑期训练日志----2018.8.25
  3. 2018 年“浪潮杯”山东省 ACM 省赛总结
  4. linux5.5救援模式,RHEL5救援模式简介RescueModeinRHEL5.PDF
  5. AntDesignUI - V3.0 技术手册(资源篇)
  6. 网站实现点击 “加入收藏 ”功能 - 代码篇
  7. 配置Sourcetree实现代码托管、分支合并、分支删除、版本控制 - 教程篇
  8. JS点击获取验证码后60秒内禁止重新获取(防刷新)
  9. WordPress暗黑极客主题Lotus1.1
  10. 一副眼镜一千多贵吗_成都配眼镜去哪里好一点?怎样配眼镜才不被坑