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毫秒。

    sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

  2.Row_Number()

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

    sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

  3.Offset Fecth

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

    sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

200W数据量

  1.Top

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

     sql server 分页总结

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

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

  2.Row_Number()

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

    sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

  3.Offset Fecth

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

    sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

2000W数据量

  1.Top

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

  2.Row_Number()

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

     sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

  3.Offset Fecth

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

    sql server 分页总结

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

    sql server 分页总结

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

    sql server 分页总结

总结

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

 

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

相关文章: