SqlServer 2012 OFFSET 和 FETCH 子句实现分页

SQLserver 202 新增加的功能,在ORDER BY 子句中新增 OFFSET 和 FETCH 子句,可以实现分页查询效果。

ORDER BY 子句中的语法如下:(参考:ORDER BY 子句 (Transact-SQL)

ORDER BY order_by_expression
    [ COLLATE collation_name ]
    [ ASC | DESC ]
    [ ,...n ]
[ <offset_fetch> ]

<offset_fetch> ::=
{
    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
    [
      FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
    ]
}

<offset_fetch> 子句中:

FIRST 和 NEXT 是同义词,是为了与 ANSI 兼容而提供的。

ROW 和 ROWS 是同义词,是为了与 ANSI 兼容而提供的。

模拟测试:

--	drop table dbo.TestTab
create table dbo.TestTab
(
	id int identity(1,1) not null primary key clustered,
	dtime datetime default(getdate())
)
go

set nocount on
insert into dbo.TestTab default values
go 50000
set nocount off

select count(*) from dbo.TestTab(nolock)

分布对比常用的一种分页查询:

对比查询1~100,20001~20100,49001~49100 行的情况。

SELECT id,dtime FROM dbo.TestTab
ORDER BY id
OFFSET 1 ROWS FETCH NEXT 100 ROWS ONLY

SELECT id,dtime FROM (
	SELECT ROW_NUMBER()OVER(ORDER BY id ASC) AS orderid,id,dtime
	FROM dbo.TestTab
) TAB
WHERE orderid BETWEEN 1 AND 100
ORDER BY orderid

结果如下:IO 是一样的(由于查询时间都为0,估计也不准,暂不统计。)


 


1~100


5001~5100行


9900~10000行


估计行数


OFFSET FETCH


开销占比


49%


84%


90%


100


ROW_NUMBER


开销占比


51%


16%


10%


9

ROW_NUMBER 在 编译内存,CPU 比 OFFSET FETCH 多。

上面统计中:OFFSET FETCH 查询的记录在表中越靠后,开销反而更大,而这个的估计行数是准确的。

OFFSET FETCH 的一个好处是简化了分页查询语句!其他有待测试!~

时间: 2024-10-29 15:31:52

SqlServer 2012 OFFSET 和 FETCH 子句实现分页的相关文章

SQL Server 2012使用Offset/Fetch Next实现分页

在Sql Server 2012之前,实现分页主要是使用ROW_NUMBER(),在SQL Server2012,可以使用Offset ...Rows  Fetch Next ... Rows only的方式去实现分页数据查询. select [column1] ,[column2] ... ,[columnN] from [tableName] order by [columnM] offset (pageIndex-1)*pageSize rows fetch next pageSize r

Sql Server 2012 的新分页方法分析(offset and fetch) - 转载

最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset and fetch 最重要的新特性是 用来 分页,既然要分析 分页,就肯定要和之前的分页方式来比较了,特别是 Row_Number() 了,在比较过程中,发现了蛮多,不过最重要的,通过比较本质,得出了优劣,也和大家一起分享下. 准备工作,建立测试表:Article_Detail,主要是用来存放一些

SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法

写法: 假装有个表Shop,其中有一列ShopName,取100000到100050条数据. ROW_NUMBER 的写法 SELECT * FROM (SELECT ShopName , ROW_NUMBER() OVER(ORDER BY ShopName) as R FROM Shop) t WHERE R>100000 AND R<=100050 OFFSET,FETCH 的写法 SELECT ShopName from Shop ORDER BY ShopName OFFSET 10

SQLServer 2012 Always on配置全过程

SQLServer 2012 Always on是针对高可用性和灾难恢复的新解决方案.可以配置一个或多个辅助副本以支持对辅助数据库进行只读访问,并且可以将任何辅助副本配置为允许对辅助数据库进行备份. 这样就提供了硬件的使用效率. “可用性组”针对一组离散的用户数据库(称为“可用性数据库”,它们共同实现故障转移)支持故障转移环境.一个可用性组支持一组主数据库以及一至四组对应的辅助数据库.可用性组在可用性副本级别进行故障转移.故障转移不是由诸如因数据文件丢失或事务日志损坏而使数据库成为可疑数据库等数

Editplus+Oracle+Visual Studio 2012+SqlServer 2008+SqlServer 2012+MyEclipse 10.6+MyEclipse 2015+WebStorm 11+WebStorm 10+WPS专业版--所有安装包,加破解 下载地址

Editplus  下载链接:https://share.weiyun.com/76924b230d140da21ea4ed877309eb5e (密码:Oftbnq) Oracle  下载链接:https://share.weiyun.com/1cc1209f483b7c298499228256f36b66 (密码:q5sPUC) Visual Studio 2012  下载链接:https://share.weiyun.com/599d9f7b1ba2826ba045f1e56297dcf2

如何删除/卸载 sqlserver 2012 数据库实例

本文介绍了如何删除/卸载 sqlserver 2012 数据库实例的方法.操作步骤如下: 进入服务器/电脑的控制面板,打开程序>程序和功能,选择Microsoft Sqlserver 2012(64位),右键选择"卸载/更改",如下图所示: 选择"卸载"功能: 开始执行卸载程序,默认,下一步: 选择要删除/卸载的数据库实例名称,如本实验演示卸载"SCOM"实例: 选择要卸载的内容,本实验选择全部,如下图: 默认,下一步: 删除规则检查,默认

SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题

原文:SQLServer 2012之AlwaysOn -- 指定数据同步链路,消除网络抖动导致的提交延迟问题 事件起因:近期有研发反应,某数据库从08切换到12环境后,不定期出现写操作提交延迟的问题: 事件分析:在排除了系统资源争用等问题后,初步分析可能由于网络抖动导致同步模式alwayson节点经常出现会话超时等待提交的问题导致. 经过排查,扩展事件里发现不定期出现35202错误,这是一条副本连接恢复的消息. 由于机房网络环境复杂,数据库服务器和应用服务器混用一个交换机,在业务高峰期时,因上联

SQLServer 2012异常问题(二)--由安装介质引发性能问题

原文:SQLServer 2012异常问题(二)--由安装介质引发性能问题 问题描述:生产环境一个数据库从SQLSERVER 2008 R2升级到SQLSERVER 2012 ,同时更换硬件,但迁移后发现性能明显下降,应用写入.读取性能下降的比较厉害: 向微软寻求帮助后得出答案,原来这与SQLSERVER的安装介质有关. 大致意思是说由于NUMA架构可以自行管理内存池,在安装了CAL的EE后,由于限制只能使用20个cores,同样内存则只能管理到20个cores涉及到的NUMA的对应的内存空间(

SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题

原文:SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题 这是上周遇到的一个案例:对已有的硬件进行升级而引发的问题,期间还触发了一个比较严重的BUG,可谓多灾多难:不过值得庆幸的是,在一连串连锁问题出现的时候,并没有出现人工操作失误(这往往是在处理故障中风险最高.影响最大的问题)而扩大故障影响范围: ==========================华丽丽的分割线========================== 先说一下环境: 我做的是跨机房3节点alwayson