SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同

 更新时间:2016年02月03日 15:39:54   作者:Eric-Lee  
这篇文章主要介绍了SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同的相关资料,需要的朋友可以参考下

临近春节,心早已飞了不在工作上了,下面小编给大家整理些数据库的几种分页查询。

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()解析函数效率比较高写。

以上所述是小编给大家分享的SQLSERVER分页查询关于使用Top方式和row_number()解析函数的不同,希望对大家有所帮助。

相关文章

  • SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用

    SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用

    今天在配置sql server 代理服务器的计划任务的时候发现了日志中提示这个SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用信息导致无法执行计划任务,那么可以按照下面的方法解决即可
    2021-06-06
  • Spark SQL 2.4.8 操作 Dataframe的两种方式

    Spark SQL 2.4.8 操作 Dataframe的两种方式

    这篇文章主要介绍了Spark SQL 2.4.8 操作 Dataframe的两种方式,方式一是通过dsl操作,方式二是利用sql方式操作,每种方式通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • 使用row_number()实现分页实例

    使用row_number()实现分页实例

    或许大家不知道,其实使用row_number()是可以实现分页的,下面有个不错的示例,大家可以尝试操作下
    2013-11-11
  • SQL Server 使用join all优化 or 查询速度

    SQL Server 使用join all优化 or 查询速度

    一个老项目,加载列表奇慢,超过10秒钟, 主要涉及两个表, user表,procuts表。因为涉及多层代理,使用site字段保存目录
    2020-09-09
  • SQL文本提取/截取的四种方式

    SQL文本提取/截取的四种方式

    本文主要介绍了SQL文本提取/截取的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • SQL Server使用Windows身份验证与JDBC连接数据库的操作流程

    SQL Server使用Windows身份验证与JDBC连接数据库的操作流程

    在企业级应用中,数据库的安全性是非常重要的,SQL Server 提供了多种身份验证方式,其中 Windows 身份验证是一种较为安全且方便的管理方式,本文将介绍如何在 Java 中使用 JDBC 连接 SQL Server 数据库,并且通过 Windows 身份验证来确保数据访问的安全性
    2024-12-12
  • SQL语法 分隔符理解小结

    SQL语法 分隔符理解小结

    单引号和双引号之间的区别最早在SQL92标准中引入的。对于标识符,这个标准区分了常规标识符和分隔的标识符。
    2009-10-10
  • 某年第一周开始日期实现方法

    某年第一周开始日期实现方法

    你想获取某一年份第一周开始的日期,Insus.NET给你的答案,可以参考使用下面这个函数
    2012-01-01
  • SQL 合并多行记录的方法总汇

    SQL 合并多行记录的方法总汇

    合并多行记录的方法,汇总。
    2009-06-06
  • SQL Server分页方法汇总

    SQL Server分页方法汇总

    这篇文章介绍了SQL Server分页的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论