SQL 2012 New Feature - OFFSET


기존 복잡한 쿼리로 구현했던 페이징을 OFFSET~FETCH 키워드를 이용하여 단순한 T-SQL 쿼리 가능해졌다.
많이 ~~ 좋아졌네^^

Syntax

ORDER BY 

              order_by_expression

    [ COLLATE 

              collation_name ] 

    [ ASC | DESC ] 

    [ ,...

              n ] 

[ <offset_fetch> ]



<offset_fetch> ::=

    OFFSET { 

              integer_constant | 

              offset_row_count_expression } { ROW | ROWS }

    [

      FETCH { FIRST | NEXT } {

              integer_constant | 

              fetch_row_count_expression } { ROW | ROWS } ONLY

    ]

}



기존 페이징과 2011의 OFFSET 키워드를 이용한 쿼리 비교

USE AdventureWorks2008R2

GO

 
DECLARE

    @PageSize    TINYINT = 20,

    @CurrentPage INT     = 1500;

 

WITH o AS

(

    SELECT TOP (@CurrentPage * @PageSize)

        [RowNumber] = ROW_NUMBER() OVER (ORDER BY SalesOrderID),

        SalesOrderID

               , SalesOrderNumber

               , OrderDate

               , SubTotal

    FROM

        Sales.SalesOrderHeader

)

SELECT SalesOrderID

               , SalesOrderNumber

               , OrderDate

               , SubTotal

    FROM o

    WHERE

        [RowNumber] BETWEEN ((@CurrentPage - 1) * @PageSize + 1)

        AND (((@CurrentPage - 1) * @PageSize) + @PageSize)

    ORDER BY

        [RowNumber];

GO

 

DECLARE

    @PageSize    TINYINT = 20,

    @CurrentPage INT     = 1500;

 

SELECT SalesOrderID

        SalesOrderID

               , SalesOrderNumber

               , OrderDate

               , SubTotal

FROM Sales.SalesOrderHeader

ORDER BY SalesOrderID

OFFSET (@PageSize * (@CurrentPage - 1)) ROWS

FETCH NEXT @PageSize ROWS ONLY;

 



복잡한 쿼리가 아주 단순해 졌다.
성능부분에서도 성능이 크게 향상되거나 좋아진 부분은 없는듯 ㅠㅠ