SQL分页查询,纯Top方式和row_number()解析函数的使用及区别

听同事分享几种数据库的分页查询,自己感觉,还是需要整理一下MS SqlSever的分页查询的。

Sql Sever 2005之前版本:

select top 页大小 *
from 表名
where id not in
(
 select top 页大小*(查询第几页-1) id from 表名 order by id
)
order by id

例如:

select top 10 * --10 为页大小
from [TCCLine].[dbo].[CLine_CommonImage]
where id not in
(
 --40是这么计算出来的:10*(5-1)
 --                    页大小*(查询第几页-1)
 select top 40 id from [TCCLine].[dbo].[CLine_CommonImage] order by id
)
order by id

结果为:

Sql Sever 2005及以上版本,多了个分页查询方法:

/*

* firstIndex:起始索引

* pageSize:每页显示的数量

* orderColumn:排序的字段名

* SQL:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句

*/

select top pageSize o.* from (select row_number() over(order by orderColumn) as rownumber,* from(SQL) as o where rownumber>firstIndex;

例如:

select top 10 numComImg.* from
( select row_number() over(order by id asc) as rownumber,* from (select *  FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)
 as numComImg where rownumber>40

结果:

这两个方法,就仅仅是多了一列 rewnumber 吗?当然不是,来看下内部差别吧:

在两个SQL上,分别加入以下SQL,并使用MS的“包括执行计划”,便于查看执行详情:

SET STATISTICS TIME ON
GO

要执行的SQL:

SET STATISTICS TIME ON
GO
select top 10 numComImg.* from
( select row_number() over(order by id asc) as rownumber,* from (select *  FROM [TCCLine].[dbo].[CLine_CommonImage]) as comImg)
 as numComImg where rownumber>40

SET STATISTICS TIME ON
GO
select top 10 * --10 为页大小
from [TCCLine].[dbo].[CLine_CommonImage]
where id not in
(
 --40是这么计算出来的:10*(5-1)
 --                    页大小*(查询第几页-1)
 select top 40 id from [TCCLine].[dbo].[CLine_CommonImage] order by id
)
order by id

执行之后,查看执行计划:

看得出,两个同样功能的SQL,执行时,使用 row_number() 的,要比是用 纯TOP方式的,查询开销少得多,上图显示 28:72,纯top方式,使用了两次聚集扫描。

再来看下执行时间信息:

row_number()方式的:

纯top方式:

相比之下,还是row_number()解析函数效率比较高写。

时间: 2024-10-15 03:55:34

SQL分页查询,纯Top方式和row_number()解析函数的使用及区别的相关文章

sql 分页查询

数据过多时sql中返回数据,开销大,用户还不一定会用到.这时使用sql分页查询,更具用户操作返回对应的数据就能极大程度提高效率. 分页有多种方法:top in.exist.row_number()等,在此只叙述相对高效的 max/top  分页方式 1.原始的 select * from dbo.pagetest where id >(select max(id) from (select top(9900) id from dbo.pagetest order by id)a) order b

SQL分页查询总结{转}

开发过程中经常遇到分页的需求,今天在此总结一下吧.简单说来方法有两种,一种在源上控制,一种在端上控制.源上控制把分页逻辑放在SQL层:端上控制一次性获取所有数据,把分页逻辑放在UI上(如GridView).显然,端上控制开发难度低,适于小规模数据,但数据量增大时性能和IO消耗无法接受:源上控制在性能和开发难度上较为平衡,适应大多数业务场景:除此之外,还可以根据客观情况(性能要求,源与端的资源占用等)在源和端之间加一层,应用特殊算法和技术进行处理.以下主要讨论源上,即SQL上的分页.分页的问题其实

SQL分页查询结果不一致

今天遇到了SQL分页查询结果不一致的情况,一看代码,原来是没加排序查询!!分页查询最好加排序,且以唯一性高的字段进行排序,如ID,时间等,以保持每页查询结果的准确! PS:又帮别人擦屁股!!

SQL Server中的分页查询 select top

SQL Server中的分页查询 https://blog.csdn.net/tswc_byy/article/details/82053091 零.码仙励志 比我差的人还没放弃,比我好的人仍在努力,我就更没资格说我无能为力 一.建库和建表 create database scort use scort create table emp ( empno int primary key, ename nvarchar(10), sal int, deptno int ) insert into e

【原创】SQL分页查询存储过程

1 ------------------------------------- 2 -----作者:张欣宇 3 -----时间:2013-06-28 4 -----简介:根据参数和条件分页查询 5 ------------------------------------- 6 Create proc [dbo].[Up_PagingQueryByParameter] 7 ( 8 ----- 表名或能查询到结果的SQL语句{SQL语句左右必须有括号例:(select * from tbl1)} 9

SpringBoot Jpa 分页查询最新配置方式

这是已经被废弃的接口 Sort sort = new Sort(Sort.Direction.DESC,"bean类中字段"); //创建时间降序排序 Pageable pageable = new PageRequest(pageNumber,pageSize,sort); 上面的用法在最新的SpringBoot中已经不再支持了,下面是一个简单的分页查询demo 持久层配置 public interface OrderDao extends JpaRepository<Orde

SQL分页查询的几种方式

需求:查询表dbo.Message,每页10条,查询第2页 1:TOP() SELECT TOP(20) * FROM dbo.Message WHERE Code NOT IN (SELECT TOP(10) Code FROM dbo.Message) 2:BETWEEN *  AND *  ,  Row_Number() OVER(ORDER BY *) AS rowNum SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #

SQL分页查询

SQLServer 的数据分页: 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names varchar(20) ) 然后向里面插入大约1000条数据,进行分页测试 假设页数是10,现在要拿出第5页的内容,查询语句如下: --10代表分页的大小 select top 10 * from test where id not in ( --40是这么计算出来的:10*(5-1) select top 4

SQL 分页查询的四种方法

方法一 假设现在有这样的一张表: CREATE TABLE test ( id int primary key not null identity, names varchar(20) ) 然后向里面插入大约100条数据,进行分页测试 假设页数是10,现在要拿出第5页的内容,查询语句如下: --10代表分页的大小 select top 10 * from test where id not in ( --40是这么计算出来的:10*(5-1) select top 40 id from test