SQL Server分页3种方案比拼[转]

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
建立表:
CREATE TABLE [TestTable] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO
 
插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON
declare @i int
set @i=1
while @i<=20000
begin
    insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
    set @i=@i+1
end
SET IDENTITY_INSERT TestTable OFF
 
-------------------------------------
分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 20 id
         FROM TestTable
         ORDER BY id))
ORDER BY ID

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 页大小*页数 id
         FROM 表
         ORDER BY id))
ORDER BY ID
-------------------------------------
分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 20 id
                 FROM TestTable
                 ORDER BY id) AS T))
ORDER BY ID

SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 页大小*页数 id
                 FROM 表
                 ORDER BY id) AS T))
ORDER BY ID

-------------------------------------
分页方案三:(利用SQL的游标存储过程分页)
create  procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
 @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling( 1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1
set nocount off
 
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
 
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
在实际情况中,要具体分析。
 
欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/archive/2009/11/05/1596931.html
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
消息中间件 存储 监控
MQ线上大规模消息堆积问题处理及使用场景详解
【11月更文挑战第21天】在如今的高并发互联网应用中,消息队列(Message Queue,简称MQ)扮演着至关重要的角色
350 1
|
存储 弹性计算 固态存储
阿里云服务器租用收费价格,X86计算架构云服务器收费标准参考
X86计算架构阿里云服务器有通用算力型u1、通用型g7、共享标准型s6、计算型c7、通用型g8i、计算型c8i等实例规格可选,不同实例规格的租用收费价格是不一样的,本文为大家汇总了目前基于X86计算架构下的各个实例规格的阿里云服务器收费标准,以供参考。
阿里云服务器租用收费价格,X86计算架构云服务器收费标准参考
|
前端开发 JavaScript
一行js弹窗代码就能设计漂亮的弹窗广告
  接到一个设计需求,要求xmyanke在网站右侧挂一个弹窗广告宣传最近的活动,找了半天都没看到合适的,自己鼓捣了一行js弹窗代码就能设计漂亮的弹窗广告,来瞧一下,欢迎拍砖提意见,js弹窗广告代码如下: document.writeln("关闭X");   把上面的代码加到js中,网址和图片路径自己修改。
1650 0
|
存储 移动开发 小程序
内存优化: 纹理压缩技术
相比普通格式图片,纹理压缩可以节省大量显存和 CPU 解码时间,且对 GPU 友好。
2739 0
内存优化: 纹理压缩技术
|
安全 云安全 云计算
阿里云肖力:云即信任
越过山丘,有人等候
4297 0
阿里云肖力:云即信任
|
Android开发 芯片 安全
|
索引
【分享】小程序购物车demo演示实例(全选与不全选、数量加减、价格汇总、删除提示)
 最近由于项目开发需要用到多选、单选、多个数量加减控制,就利用小程序做了个购物车demo,仅供参考。 要点: 加减商品数量(可自定义商品数量)、汇总价格、全选与全不选、删除商品弹窗提示 思路: 一、本地模拟Json数据格式的数组(1.购物车商品id:cid   2.标题title   3.图片地址   4.数量num   5.价格price   6.小计   7.是否选中selected) 二、点击复选框操作 如已经选中的,经点击变成未选中,反之而反之 点击依据index作为标识,而不用cid,方便遍历 三、全选操作 首次点击即为全部选中,再次点击为全不选。
13107 0
|
安全 中间件 大数据
实力说话,Aliware 生态联盟前锐力量——数梦工场再登高峰
7月5日,阿里云 Aliware“铂金合作伙伴”授牌仪式在云栖小镇成功举办,阿里云企业业务事业部总架构师王晶昱、阿里巴巴中间件事业部合作生态专家徐政参加了授牌仪式。数梦工场企业事业部总经理段云飞、数梦工场企业事业部技术总监戴霖、数梦工场阿里云业务部总监吴昊参加了此次授牌仪式,吴昊从沈询手里接过了授权牌。
3673 0