几种常见SQL分页方式效率比较

发表于:2011-11-09 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:向瑜    来源:51Testing软件测试网采编

  分页很重要,面试会遇到。不妨再回顾总结一下。

  1、创建测试环境,(插入100万条数据大概耗时5分钟)。

createdatabaseDBTest
useDBTest

--创建测试表
createtablepagetest
(
idintidentity(1,1)notnull,
col01intnull,
col02nvarchar(50)null,
col03datetimenull
)

--1万记录集
declare@iint
set@i=0
while(@i<10000)
begin
insertintopagetestselectcast(floor(rand()*10000)asint),left(newid(),10),getdate()
set@i=@i+1
end

  2、几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。

--写法1,not in/top
selecttop50*frompagetest
whereidnotin(selecttop9900idfrompagetestorderbyid)
orderbyid




--写法2,not exists
selecttop50*frompagetest
wherenotexists
(select1from(selecttop9900idfrompagetestorderbyid)awherea.id=pagetest.id)
orderbyid

--写法3,max/top
selecttop50*frompagetest
whereid>(selectmax(id)from(selecttop9900idfrompagetestorderbyid)a)
orderbyid

--写法4,row_number()
selecttop50*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900

select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumber>9900andrownumber<9951

select*from
(selectrow_number()over(orderbyid)rownumber,*frompagetest)a
whererownumberbetween9901and9950

--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select*
from(
selectrow_number()over(orderbytempColumn)rownumber,*
from(selecttop9950tempColumn=0,*frompagetestwhere1=1orderbyid)a
)b
whererownumber>9900

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号