zoukankan      html  css  js  c++  java
  • sql server 分页总结

    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

  • 相关阅读:
    第七章第五题(打印不同的教)(Print distinct numbers)
    第七章第四题(分析成绩)(Analyze scores)
    第七章第三题(计算数字的出现次数)(Count occurrence of numbers)
    第七章第二题(倒置输入的数)(Reverse the numbers entered)
    第七章第一题(指定等级)(Assign grades)
    第六章第三十九题(几何:点的位置)(Geometry: point position)
    第六章第三十八题(生成随机字符)(Generate random characters)
    Java提示错误: 找不到或无法加载主类
    第六章第三十七题(格式化整数)(Format an integer)
    第六章第三十六题(几何:正多边形的面积)(Geometry: area of a regular polygon)
  • 原文地址:https://www.cnblogs.com/ZbsCc/p/11633660.html
Copyright © 2011-2022 走看看