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

推荐订阅源

Forbes - Security
Forbes - Security
T
Troy Hunt's Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
H
Hacker News: Front Page
TaoSecurity Blog
TaoSecurity Blog
PCI Perspectives
PCI Perspectives
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
Vulnerabilities – Threatpost
博客园 - 【当耐特】
V
Visual Studio Blog
N
News and Events Feed by Topic
Security Archives - TechRepublic
Security Archives - TechRepublic
V
V2EX
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
WordPress大学
WordPress大学
T
Tor Project blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
P
Proofpoint News Feed
A
Arctic Wolf
C
CERT Recently Published Vulnerability Notes
Last Week in AI
Last Week in AI
T
Tenable Blog
K
Kaspersky official blog
爱范儿
爱范儿
S
Security @ Cisco Blogs
Spread Privacy
Spread Privacy
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Project Zero
Project Zero
W
WeLiveSecurity
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
小众软件
小众软件
Webroot Blog
Webroot Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Attack and Defense Labs
Attack and Defense Labs

博客园 - 老羽

推荐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种写法效率相差无几,第一种有明显的区别。