MS-SQL Server

SQL Server 2012 신규 기능 소개 - Analytic Functions

임현수 2012. 1. 14. 13:36

SQL Server 2012에 신규로 추가된 Analytic Functions 중 LAG 함수 사용 사례를 보도록 하겠습니다.
조회시 데이터 레코드간에 편차를 보여주고 싶을 때 사용하시면 매우 유용한 기능입니다.

함수에 대한 간략히 설명드리고, SQL Server 2008 R2 이하 버전에서는 어떻게 쿼리 작성을 해서 사용했었는지와
함수 사용을 할 경우 성능차이가 있는지 테스트를 해보도록 하겠습니다.

[설명/문법]
1. 설명
 
    - LAG 함수란 동일한 레코드셋안에서 이전에 조회된 레코드에 포함된 값을 접근할 수 있도록 해줍니다. 
      SQL Server 2008 R2 이전 버전에서 동일한 결과를 만들기 위해서는 셀프조인을 활용해야 가능했습니다.

2.  문법 (상세내용은 온라인 도움말 참고)
    - LAG (scalar_expression [,offset] [,default]) OVER ( [partition_by_clause ] order_by_clause )

[테스트]
1. 테스트 환경 셋팅

-- 데이터베이스 생성

create database TESTDB 

use testdb
go

-- 임시 테이블 생성
-- drop table tab_01
create table Tab_01 (
    seqNo int identity(1,1)
,   compareValue int default 0);
go

create clustered index idx_Tab_01_seqNo on Tab_01 (seqNo)
go

-- 20개의 compareValue 랜덤값을 가지는 데이터 입력
insert into tab_01 (compareValue) values (rand()*1000)
go 20

-- 쿼리 성능 보기 위한 옵션 설정
set statistics io on
set statistics time on

2-1. LAG 함수 사용 (Case 1)
select
    seqNo
,   compareValue
,   lag(compareValue, 1, 0) over (order by seqNo) as LagValue
from tab_01 with (readuncommitted)
order by seqNo

-- 결과



-- 성능


-- 실행계획


2-2. 셀프 조인 사용_01 (Case 2, 순차적인 고유번호가 있는 경우)
select a.seqNo, a.CompareValue, b.CompareValue
from tab_01 a with (readuncommitted)
   
left outer join tab_01 b with (readuncommitted) on a.seqNo -1 = b.seqNo
order by a.seqNo

-- 결과


-- 성능


-- 실행계획


2-3. 셀프 조인 사용_02 (Case 3, 순차적인 고유번호가 없는 경우)
select a.seqNo, a.CompareValue, b.CompareValue
from
   
(
     select seqNo, CompareValue, rank() over (order by seqNo asc) RankNo
    
from tab_01 with (readuncommitted)
    )
a
    left outer join
   
(
     
select seqNo, CompareValue, rank() over (order by seqNo asc) RankNo
    
from tab_01 with (readuncommitted)
    )
b
    on a.RankNo -1 = b.RankNo
order by a.seqNo

-- 결과


-- 성능


-- 실행계획


3. 테스트 결과
    - 테스트 결과 IO 사용량의 차이는 아래와 같습니다. LAG 함수 사용이 이전 방식에 비하여 20배이상 성능이 좋은 것을 볼 수 있습니다.
      > Case 1. LAG 함수 사용 : 논리적인 읽기수 = 2
      > Case 2. 셀프 조인 사용_01 : 논리적인 읽기수 = 42
      > Case 3. 셀프 조인 사용_02 : 논리적인 읽기수 = 43

[의견]

    - LAG 함수를 사용하는 경우 조인을 하지 않아도 되기 때문에 읽기수 비용 절감율이 높다.
    - 다양한 활용/응용이 가능한 함수이기 때문에 참고에 적어놓은 아티클은 꼭 보시기를 권장해드리고 싶습니다.

[참고]
1. SQL Server 2012 온라인 도움말
2. SQL Server Mag - SQL Server 2012's Window Functions, Part 2 (Itzik Ben-Gan)