分页实现:Offset-Fetch

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

分页实现的方法又多了一种,在SQL Server 2012版本中,TSQL在Order By子句中新增 Offset-Fetch子句,用于从有序的结果集中,跳过一定数量的数据行,获取指定数量的数据行,从而达到数据行分页的目的。经过测试,从逻辑读取数量和响应的时间消耗来测评,使用Offset-Fetch实现的分页方式,比Row_Number()方式性能要高很多。

Offset-Fetch子句要求结果集是有序的,因此,只能用于order by 子句中,语法如下:

复制代码
ORDER BY order_by_expression [ ASC | DESC ]  [ ,...n ] [ <offset_fetch> ]
<offset_fetch> ::=
{ 
    OFFSET { integer_constant | offset_row_count_expression } ROWS
    [ FETCH NEXT {integer_constant | fetch_row_count_expression } ROWS ONLY ]
}
复制代码

关键字解析:

  • Offset子句:用于指定跳过(Skip)的数据行;
  • Fetch子句:该子句在Offset子句之后执行,表示在跳过(Sikp)指定数量的数据行之后,返回一定数据量的数据行;
  • 执行顺序:Offset子句必须在Order By 子句之后执行,Fetch子句必须在Offset子句之后执行;

分页实现的思路:

  1. 在分页实现中,使用Order By子句,按照指定的columns对结果集进行排序;
  2. 使用Offset子句跳过前N页:Offset (@PageIndex-1)*@RowsPerPage rows;
  3. 使用Fetch子句呈现当前Page:Fetch next @RowsPerPage rows only;

一,Offset-Fetch 实现分页的示例代码

1,创建示例数据

View Code

2,使用Offset子句跳过指定数目的数据行

select * 
from dbo.dt_test
order by id
offset 2 ROWS

3,使用Offset-Fetch子句跳过指定数目的数据行之后,返回指定数目的数据行

select * 
from dbo.dt_test
order by id
offset 2 ROWS
FETCH Next 2 rows only

4,修改成分页的通用格式

复制代码
--分页的索引,页码从0开始
Declare @PageIndex int
--每页显示的行数
Declare @Size int

set @PageIndex=1
set @Size=2

select * 
from dbo.dt_test
order by id
OFFSET @PageIndex*@Size ROWS
FETCH next @Size rows only
复制代码

二,排序(order by)

order by子句的语法是:ORDER BY order_by_expression ,用于按照指定字段进行排序,通常有3种写法:

  • select子句中列的name,或alias,排序子句(order by)的执行顺序在select子句之后,可以使用列的Alias进行排序;
  • 表达式,按照表达式的计算结果进行排序;
  • select子句中列的序号,从1开始,此处的数值是序号,不建议使用;

上述三种写法都会对查询结果集进行排序,返回的结果集是有序的,但是,如果这样写,在order by子句中使用一个常量:

order by (select 1) 

该子句中的 1 不是列的序号,而是常量,SQL Server按照结果集的原始顺序返回,order by子句不对结果集排序。

 

参考文章:

ORDER BY Clause (Transact-SQL)

SQL Server 2012使用OFFSET/FETCH NEXT分页及性能测试

SQL Server 2012提供的OFFSET/FETCH NEXT与Row_Number()对比测试

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: SQL Server
标签: TSQL, 分页







本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/4861263.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
目录
相关文章
|
6月前
|
机器学习/深度学习 存储 SQL
别再用offset和limit分页了
别再用offset和limit分页了
33 0
offset、client、scroll三大系列
offset、client、scroll三大系列
68 0
|
机器学习/深度学习 存储 SQL
别再用 offset 和 limit 分页了,性能太差
别再用 offset 和 limit 分页了,性能太差
1507 0
别再用 offset 和 limit 分页了,性能太差
|
SQL 存储 Oracle
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
3834 0
|
SQL 关系型数据库 MySQL
MGR修改max_binlog_cache_size参数导致异常
MGR修改max_binlog_cache_size参数导致异常
165 0
MGR修改max_binlog_cache_size参数导致异常
分页获取数据列表GetListByPage
分页获取数据列表GetListByPage
88 0
|
数据采集 算法 前端开发
查询分页不只有 limit,这四种分页方法值得掌握
查询分页不只有 limit,这四种分页方法值得掌握
263 0
查询分页不只有 limit,这四种分页方法值得掌握
|
数据库
分页limit和排序order by
分页limit和排序order by
|
机器学习/深度学习 存储 SQL
求求你别再用 MySQL offset 和 limit 分页了
不需要担心数据库性能优化问题的日子已经一去不复返了。 随着时代的进步,随着野心勃勃的企业想要变成下一个 Facebook,随着为机器学习预测收集尽可能多数据的想法的出现,作为开发人员,我们要不断地打磨我们的 API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。
求求你别再用 MySQL offset 和 limit 分页了