惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Microsoft Security Blog
Microsoft Security Blog
B
Blog
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
爱范儿
爱范儿
博客园_首页
博客园 - 聂微东
量子位
V
Visual Studio Blog
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
J
Java Code Geeks
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
F
Fortinet All Blogs
The Cloudflare Blog
T
Tailwind CSS Blog
G
Google Developers Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
腾讯CDC

博客园 - 老羽

推荐AspNetPager分页控件 WM中实现Splash动画效果 自定义合并多文件协议设计 JScript中Date.getTime转.Net中的DateTime .net中处理C/C++中的位域 POOM(Pocket Outlook Object Model)开发介绍及应用(转) 多线程执行多任务的DEMO GPRS管理与创建APN拨号连接 WM中电话相关的技巧 - 老羽 - 博客园 一道面试题题解 【转】Windows Mobile控制面板程序 [转]Windows Mobile上的服务程序 Smartphone2003开发总结一:Form总结 C++常用技巧一(整理收集) [转]CString,string,char*的综合比较 [转] C++ Windows字符和字符指针类型 [转]C++ int,char,string,CString类型转换(整理总结) C++字符串函数详解[转] Smartphone2003中实现焦点在ListView控件与其它控件中切换
SqlServer2005中分页代码测试
老羽 · 2010-07-13 · via 博客园 - 老羽

参考了这篇帖子:http://topic.csdn.net/u/20100617/04/80D1BD99-2E1C-4083-AD87-72BF706CB536.html,我对分页代码进行了测试,增加一部分测试内容。我测试的表t_um_ob_gprs_log 共有数据近30W条,有时间我将用此脚本在服务器上测试近亿数据的表。

--开始测试查询
declare @now datetime
--max方案
select 'max'方案
select @now=getdate()
--begin
select top 10 * from t_um_ob_gprs_log
where c_id>(
  select max(c_id)
  from (
    select top 199999 c_id from t_um_ob_gprs_log order by c_id)tt)
--end
declare @maxDiff int
select @maxDiff=datediff(ms,@now,getdate())

--top方案
select 'top'方案
select @now=getdate()
--begin
select top 10 * from t_um_ob_gprs_log
where c_id not in(select top  199999 c_id from t_um_ob_gprs_log)
--end
declare @topDiff int
select @topDiff=datediff(ms,@now,getdate())

--row_number方案
select 'row_number' 方案
select @now=getdate()
--begin

--select *
--from(
--select top 200009 row_number()over(order by c_id)rn,* from t_um_ob_gprs_log
--)t
--where rn>199999

SELECT  TOP 10 * FROM (SELECT row_number() OVER(ORDER BY c_id) rn,* FROM t_um_ob_gprs_log)t
WHERE rn >199999

--SELECT   * FROM (SELECT row_number() OVER(ORDER BY c_id) rn,* FROM t_um_ob_gprs_log)t
--WHERE rn >=199999 AND rn<=200009
--end
declare @row_numberDiff int
select @row_numberDiff=datediff(ms,@now,getdate())

--row方案 row_number中orderby以常量代替;排序时以最内层子查询排序
select 'row'方案
select @now=getdate()
--begin
--select *
--from (
--select row_number()over(order by tc)rn,*
--from (select top 200000 0 AS tc,* from t_um_ob_gprs_log)t
--)tt
--where rn>199999
--end
select *
from (
select row_number()over(order by tc)rn,*
from (select top 200009 0 AS tc,* from t_um_ob_gprs_log ORDER BY c_id)t
)tt
where rn>199999

declare @rowDiff int
select @rowDiff=datediff(ms,@now,getdate())

--记录结果
select '第199999 - 200009' as 页码,@maxDiff as max方案,@topDiff as top方案,@rowDiff as row方案,@row_numberDiff as row_number方案

测试结果:(执行了5次)

1)
页码                max方案       top方案       row方案       row_number方案
----------------- ----------- ----------- ----------- ------------
第199999 - 200009  126         156         76          76

2)
页码                max方案       top方案       row方案       row_number方案
----------------- ----------- ----------- ----------- ------------
第199999 - 200009  156         140         96          76

3)
页码                max方案       top方案       row方案       row_number方案
----------------- ----------- ----------- ----------- ------------
第199999 - 200009  186         140         93          80

4)
页码                max方案       top方案       row方案       row_number方案
----------------- ----------- ----------- ----------- ------------
第199999 - 200009  173         186         96          76

5)
页码                max方案       top方案       row方案       row_number方案
----------------- ----------- ----------- ----------- ------------
第199999 - 200009  186         143         76          93

可见row_num ber方案还是很有优势的,而两种不同的row_number写法执行时间并没有明显的差距。

同时,也测试了几种不同写法的row_number执行效果:

declare @now datetime

--row_number 方案
select 'row_number 1 ' 方案
select @now=getdate()

select *
from(
select top 200009 row_number()over(order by c_id)rn,* from t_um_ob_gprs_log
)t
where rn>199999

declare @row_numberDiff1 int
select @row_numberDiff1=datediff(ms,@now,getdate())

--row_number 方案
select 'row_number 2 ' 方案
select @now=getdate()

SELECT  TOP 10 * FROM (SELECT row_number() OVER(ORDER BY c_id) rn,* FROM t_um_ob_gprs_log)t
WHERE rn >199999

declare @row_numberDiff2 int
select @row_numberDiff2=datediff(ms,@now,getdate())

--row_number 方案
select 'row_number 3 ' 方案
select @now=getdate()

SELECT   * FROM (SELECT row_number() OVER(ORDER BY c_id) rn,* FROM t_um_ob_gprs_log)t
WHERE rn >=199999 AND rn<=200009

declare @row_numberDiff3 int
select @row_numberDiff3=datediff(ms,@now,getdate())

--row_number 方案
select 'row_number 4 ' 方案
select @now=getdate()

select *
from (
select row_number()over(order by tc)rn,*
from (select top 200009 0 AS tc,* from t_um_ob_gprs_log ORDER BY c_id)t
)tt
where rn>199999

declare @row_numberDiff4 int
select @row_numberDiff4=datediff(ms,@now,getdate())

--记录结果
select '第199999 - 200009' as 页码,@row_numberDiff1,@row_numberDiff2,@row_numberDiff3,@row_numberDiff4

测试结果:(5次执行时间)

1)第199999 - 200009  106         110         80          93
2)第199999 - 200009  93          110         93          80
3)第199999 - 200009  123         96          76          76
4)第199999 - 200009  173         93          76          80
5)第199999 - 200009  203         76          80          76

由此可见,后3种写法效率相差无几,第一种有明显的区别。