SQL SERVER2012新分页方式

系统 1637 0

SQL SERVER2012在ORDER BY 子句中加入了新元素offset,允许用户在排序完成的结果集中自定义输出行范围,大大简化了分页SQL的书写方式和效率。以下是与以前的两种分页方式的简单对比

        
          use
        
         master


        
          go
        
        
          set
        
         nocount 
        
          on
        
        
          go
        
        
          set
        
         showplan_text 
        
          on
        
        
          go
        
      
        
          --2012的OFFSET分页方式


        
        
          select
        
        
          number
        
        
          from
        
         spt_values


        
          where
        
         type
        
          =
        
        
          '
        
        
          p
        
        
          '
        
        
          order
        
        
          by
        
        
          number
        
         offset 
        
          10
        
         rows 
        
          fetch
        
        
          next
        
        
          5
        
         rows 
        
          only
        
        ;


        
          go
        
      
        
          --2005的ROW_NUMBER分页方式


        
        
          select
        
        
          number
        
        
          from
        
         (


        
          select
        
        
          number
        
        ,row_number() 
        
          over
        
        (
        
          order
        
        
          by
        
        
          number
        
        ) 
        
          as
        
         num 
        
          from
        
         spt_values 
        
          where
        
         type
        
          =
        
        
          '
        
        
          p
        
        
          '
        
        

) t 
        
          where
        
         num 
        
          between
        
        
          11
        
        
          and
        
        
          15
        
        
          order
        
        
          by
        
        
          number
        
        
          asc
        
        
          go
        
      
        
          --2000的TOP分页方式


        
        
          select
        
        
          number
        
        
          from
        
         (


        
          select
        
        
          top
        
        
          5
        
        
          number
        
        
          from
        
         (


        
          select
        
        
          top
        
        
          15
        
        
          number
        
        
          from
        
         spt_values 
        
          where
        
         type
        
          =
        
        
          '
        
        
          p
        
        
          '
        
        
          order
        
        
          by
        
        
          number
        
        
          asc
        
        

) t


        
          order
        
        
          by
        
        
          number
        
        
          desc
        
        

) t 


        
          order
        
        
          by
        
        
          number
        
        
          asc
        
        
          go
        
        
          set
        
         showplan_text 
        
          off
        
        
          go
        
        
          /*
        
        
          

StmtText

----------------------------------------------------------------------------------------------------------

select number 

from spt_values

where type='p'

order by number offset 10 rows fetch next 5 rows only;



StmtText

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  |--Top(OFFSET EXPRESSION:((10)),TOP EXPRESSION:((5)))

       |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]),  WHERE:(CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0)=N'p') ORDERED FORWARD)



StmtText

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

select number from (

select number,row_number() over(order by number) as num from spt_values where type='p'

) t where num between 11 and 15

order by number asc



StmtText

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  |--Sort(ORDER BY:([mssqlsystemresource].[sys].[spt_values].[number] ASC))

       |--Filter(WHERE:([Expr1005]>=(11) AND [Expr1005]<=(15)))

            |--Top(TOP EXPRESSION:(CASE WHEN (15) IS NULL OR (15)<(0) THEN (0) ELSE (15) END))

                 |--Sequence Project(DEFINE:([Expr1005]=row_number))

                      |--Segment

                           |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]),  WHERE:(CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0)=N'p') ORDERED FORWARD)



StmtText

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

select number from (

select top 5 number from (

select top 15 number from spt_values where type='p' order by number asc

) t

order by number desc

) t 

order by number asc



StmtText

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  |--Sort(ORDER BY:([mssqlsystemresource].[sys].[spt_values].[number] ASC))

       |--Sort(TOP 5, ORDER BY:([mssqlsystemresource].[sys].[spt_values].[number] DESC))

            |--Top(TOP EXPRESSION:((15)))

                 |--Index Scan(OBJECT:([mssqlsystemresource].[sys].[spt_values].[ix2_spt_values_nu_nc]),  WHERE:(CONVERT(nchar(3),[mssqlsystemresource].[sys].[spt_values].[type],0)=N'p') ORDERED FORWARD)




        
        
          */
        
      
      
        从查询计划来看,2012的查询计划中,offset直接操作了top迭代器,分页计划十分简单,看起来也比后两种简单明了。
      
    
      
        而在系统预估的查询开销中,OFFSET占9%,ROW_NUMBER占45%,TOP占47%(加起来101% -_-||),OFFSET占了绝对的优势。
      
    


在2008的更新中,我最喜欢的是MERGE,2012中就是OFFSET了。

SQL SERVER2012新分页方式


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论