1、第一种方式:使用 ROW_NUMBER() OVER(ORDER BY ID) …… BETWEEN AND 的方式
SELECT * FROM(
SELECT
ROW_NUMBER() OVER(ORDER BY ID) AS NUMBER,
*
FROM FillReport
)T
WHERE NUMBER BETWEEN 100 AND 200

2、使用 OFFSET ROWS FETCH NEXT ROWS ONLY 的方式
SELECT *
FROM FillReport
ORDER BY ID OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY

3、使用 NOT IN 的方式
SELECT TOP 3
*
FROM FillReport
WHERE ID NOT IN (SELECT TOP 15 ID FROM FillReport) 4、使用存储过程的方式

  CREATE PROC PAGE_DEMO
    @TABLENAME VARCHAR(20),
    @PAGESIZE INT,
    @PAGE INT
  AS
  DECLARE
    @NAMEPAGE INT,
    @RES VARCHAR(100)
  BEGIN
    SET @NAMEPAGE=@PAGESIZE*(@PAGE-1)
    SET @RES='SELECT * FROM ' + @TABLENAME + ' ORDER BY ID OFFSET ' + CAST(@NAMEPAGE AS varchar(10)) + 'ROWS FETCH NEXT ' + CAST(@PAGESIZE AS varchar(10)) + 'ROWS ONLY'
    EXEC(@RES)
  END

  EXEC PAGE_DEMO @TABLENAME = 'FillReport', @PAGESIZE = 3, @PAGE = 5

Top的分页是基本上所有的版本的sql server都可以使用的,row_number()是sql 2005以上,offset fetch需要sql 2012才支持了。

测试性能:

20W数据量

  1.Top

    第1页十次执行平均时间29.1毫秒。

    

    第1万页十次执行平均时间109.2毫秒。

    

    第2万页十次执行平均时间126.8毫秒。

    

  2.Row_Number()

   第1页十次执行平均时间20.2毫秒。

    

    第1万页十次执行平均时间96.5毫秒。

    

    第2万页十次执行平均时间153.8毫秒。

    

  3.Offset Fecth

   第1页十次执行平均时间19.3毫秒。

    

    第1万页十次执行平均时间70毫秒。

    

    第2万页十次执行平均时间75.1毫秒。

    

200W数据量

  1.Top

    第1页十次执行平均时间55.9毫秒。

    

    第10万页十次执行平均时间.....毫秒。

    执行了好几十秒。。。。直接淘汰

  2.Row_Number()

   第1页十次执行平均时间25.5毫秒

    

    第10万页十次执行平均时间642.3毫秒

    

    第20万页十次执行平均时间1257毫秒

    

  3.Offset Fecth

    第1页十次执行平均时间24.7毫秒

    

    第10万页十次执行平均时间220.5毫秒

    

    第20万页十次执行平均时间396毫秒

    

2000W数据量

  1.Top

   因为在上一轮被淘汰了,所以这一轮就算了。。

  2.Row_Number()

    第1页十次执行平均时间57毫秒

    

    第100W页十次执行平均时间6401.5毫秒

    

    第200W页十次执行平均时间14606.2毫秒

    

  3.Offset Fecth

   第1页十次执行平均时间27.5毫秒

    

    第100W页十次执行平均时间1778.9毫秒

    

    第200W页十次执行平均时间3523.2毫秒

    

总结

  可以看出来数据量越大、分页页码越大对分页效率影响就越大。top的分页方法早早出局,很明显是因为not in 的数据量太庞大了,所以要是有好的top分页方法可以下面留言,我也会进行测试。row_number的分页方法算是比较好的了,而且sql2005及以上的数据库都可以用,受众范围比较大,而offset fecth的性能更加优越,但是只有sql2012及以上的才支持。

测试这一块的数据是参考的这篇文章:https://www.cnblogs.com/xwc1996/p/9113049.html

sql server 分页总结的更多相关文章

  1. SQL SERVER 分页方法

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...

  2. SQL Server分页模板

    SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...

  3. SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条

    SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...

  4. 解决hibernate对Sql Server分页慢的问题

    一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...

  5. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  6. SQL server分页的四种方法

    SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路  先取前20页, ...

  7. 二、SQL Server 分页

    一.SQL Server 分页 --top not in方式 select top 条数 * from tablename where Id not in (select top 条数*页数 Id f ...

  8. SQL server分页的四种方法(算很全面了)

      这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...

  9. SQL Server 分页方法汇总

    PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ...

  10. SQL Server 分页语句

      表中主键必须为标识列,[ID] int IDENTITY (1,1) 1.分页方案一:(利用Not In和SELECT TOP分页) SELECT TOP 页大小 * FROM TestTable ...

随机推荐

  1. XGBoost 完整推导过程

    参考: 陈天奇-"XGBoost: A Scalable Tree Boosting System" Paper地址: <https://arxiv.org/abs/1603 ...

  2. 如果使用jsp文件,需要在配置文件中配置resources项,才能让idea识别这个jsp文件

    没有添加这一项在编译后的.class文件中的结构目录是这样子的 添加上这一个配置项,在class配置文件中的位置是这样子的: 添加的配置文件是这样子的: <resources> <r ...

  3. LeetCode 154. Find Minimum in Rotated Sorted Array II寻找旋转排序数组中的最小值 II (C++)

    题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...

  4. USACO River Crossing

    洛谷 P2904 [USACO08MAR]跨河River Crossing https://www.luogu.org/problem/P2904 JDOJ 2574: USACO 2008 Mar ...

  5. LG2272/BZOJ1093 「ZJOI2007」最大半连通子图 Tarjan缩点+DAG求最长链

    问题描述 LG2272 BZOJ1093 题解 观察半联通的定义,发现图中的一些结点,构成的链一定是一个半联通子图. 此时存在的环可能会干扰求解,于是\(\mathrm{Tarjan}\)缩点. 于是 ...

  6. 【转】使用Hibernate的好处是什么?

    一.Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架,和App Server,和EJB没有什么必然的联系.Hibernate可以用在任何JDBC可以使用的场合,例如Java ...

  7. MacBook安装WIN7开机黑屏的解决办法

    同事的一台Macbook,全盘用diskgenius格式化为MBR分区,支持BIOS启动,安装ghost版本的WIN7,开机黑屏,看了网上的帖子没有用,插入启动盘按option键选择从优盘启动,用di ...

  8. [LeetCode] 763. Partition Labels 分割标签

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  9. shell脚本中“$?”标记的用途是什么?

    在写一个shell脚本时,如果你想要检查前一命令是否执行成功,在if条件中使用“$?”可以来检查前一命令的结束状态.

  10. ros脚本断点调试-编写过程可以把过程变量输出到log查看的方法

    /caps-man registration-table :do {:foreach i in=[find interface~"5G"] do={:log info messag ...