SQL Server 2012의 신규 함수로 LAG, LEAD 가 있습니다.

이미 오라클에서는 지원하고 있었지만, SQL Server 는 2012에 포함되었네요.

 

LAG 함수는 현재 결과집합에서 이전 행의 데이터를 가져오는 함수이고,

LEAD 함수는 LAG와 반대로 현재 결과집합에서 다음 행의 데이터를 가져오는 함수입니다.

 

이 함수가 나오기 이전에는 SELF JOIN을 사용하거나 CTE(Common Table Expression)을 사용해야 했습니다.

 

각설하고... SQL Server 2012의 샘플DB인 AdventureWoks2012 데이터베이스에서 예제를 만들어 보았습니다.

 

1. 원본 데이터 SELECT 

 

USE AdventureWorks2012

GO

 

SELECT

        ProductID, ModifiedDate, StandardCost

FROM

        Production.ProductCostHistory

WHERE

        ProductID IN (711, 712, 713)

ORDER BY

        ProductID, ModifiedDate

 

1.png

 

 

2. CTE 로 구현.

 

WITH LAG_LEAD_CTE

AS

(

        SELECT

               ROW_NUMBER() OVER (ORDER BY ProductID, ModifiedDate) AS RN, ProductID, ModifiedDate, StandardCost

        FROM

               Production.ProductCostHistory

        WHERE

               ProductID IN (711, 712, 713)

)

SELECT

        A.ProductID, A.StandardCost, A.ModifiedDate, B.StandardCost AS PrevStandardCost, C.StandardCost AS NextStandardCost

FROM

        LAG_LEAD_CTE A LEFT JOIN LAG_LEAD_CTE B ON A.ProductID = B.ProductID AND A.RN = B.RN + 1

        LEFT JOIN LAG_LEAD_CTE C ON A.ProductID = C.ProductID AND A.RN = C.RN - 1

ORDER BY

        A.ProductID, A.ModifiedDate

;

 

2-1.png

 ROW_NUMBER  를 주고 재귀쿼리를 이용,  뒤의 ROW, 앞의 ROW 와 조인하여  결과를 보여줍니다.

 

 

3. LAG / LEAD 함수를 사용하여 구현

 

SELECT

        ProductID, StandardCost, ModifiedDate,

        LAG(StandardCost, 1, NULL) OVER (PARTITION BY ProductID ORDER BY ModifiedDate) PrevStandardCost,

        LEAD(StandardCost, 1, NULL) OVER (PARTITION BY ProductID ORDER BY ModifiedDate) NextStandardCost

FROM

        Production.ProductCostHistory

WHERE

        ProductID IN (711, 712, 713)

ORDER BY ProductID, ModifiedDate

;

 

3-1.png

결과는 CTE와 LAG, LEAD 함수 사용 시 모두 같습니다만, 훨씬 구문이 가벼워진 것을 알 수 있습니다.

 

 

 

그럼 CTE로 구현했을 때와 LAG / LEAD 함수 로 구현했을 때의 성능 차이는 어느 정도일까요?

 

1) CTE 로 구현 시 IO 및 TIME 수치

 

SQL Server 구문 분석 컴파일 시간:

   CPU 시간 = 16ms, 경과 시간 = 25ms.

 

(9 행이 영향을 받음)

테이블 'Worktable'. 검색 0, 논리적 읽기 0, 물리적 읽기 0, 미리 읽기 0, LOB 논리적 읽기 0, LOB 물리적 읽기 0, LOB 미리 읽기 0.

테이블 'ProductCostHistory'. 검색 9, 논리적 읽기 18, 물리적 읽기 0, 미리 읽기 0, LOB 논리적 읽기 0, LOB 물리적 읽기 0, LOB 미리 읽기 0.

 

 SQL Server 실행 시간:

 CPU 시간 = 16밀리초, 경과 시간 = 4밀리초

 

 

2) LAG, LEAD 함수를 사용하여 구현 시 IO 및 TIME 수치

 

SQL Server 구문 분석 컴파일 시간:

   CPU 시간 = 11ms, 경과 시간 = 11ms.

 

(9 행이 영향을 받음)

테이블 'Worktable'. 검색 0, 논리적 읽기 0, 물리적 읽기 0, 미리 읽기 0, LOB 논리적 읽기 0, LOB 물리적 읽기 0, LOB 미리 읽기 0.

테이블 'ProductCostHistory'. 검색 3, 논리적 읽기 6, 물리적 읽기 0, 미리 읽기 0, LOB 논리적 읽기 0, LOB 물리적 읽기 0, LOB 미리 읽기 0.

 

 SQL Server 실행 시간:

 CPU 시간 = 0밀리초, 경과 시간 = 1밀리초

 

CTE보다 더 좋은 성능이 나오네요.

 

참고 URL

LAG : http://msdn.microsoft.com/ko-kr/library/hh231256.aspx

LEAD : http://msdn.microsoft.com/ko-kr/library/hh213125.aspx

 

짧은 팁입니다...

 

간혹 Linked Server 로 Open Query를 사용할 때, USE 명령어를 써야 할 때가 있습니다.

 

하지만 일반적인 방식으로 사용하면서 USE 명령어를 쓰면

 

"연결된 서버 "서버"의 OLE DB 공급자 "SQLNCLI10"은(는) 개체에 열이 없거나 현재 사용자에게 해당 개체에 대한 사용 권한이 없음을 나타냅니다." 오류가 발생합니다.

 

이럴 때에는 EXEC 라는 명령어로 한번 더 감싸주면 됩니다.

 

SELECT * FROM OPENQUERY

       (연결된서버,'

       EXEC (

             ''USE Database;

             EXEC dbo.TestSP;''

             );'

       )

 

이상입니다.

 

SQL Server 평가판을 설치해 놓고, 한동안 잊고 살다가~~
SQL Server 2012 Management Studio를 실행하면...

1.png

 

이런 메시지를 만날 수 있습니다. 두둥~

2.png

 

정식 에디션을 구매했음에도 불구하고, 이런 메시지를 만나면 멘붕이 오면서 O/S 재설치를 고려할 수도 있는데,

이 때에는 업그레이드 기능을 이용하면 됩니다.

 

1. 우선 정식 DVD를 넣고, 자동실행을 한 뒤, "유지 관리" 를 선택합니다.

3.png

 

2. 유지관리에서 "버전 업그레이드"를 선택합니다.

4.png

 

3. 다음과 같이 화면이 변경되면서 업그레이드가 시작됩니다.

5.png

 

6.png

 

 4. 설치 규칙 검사를 진행합니다.

7.png

 

5. 특별한 문제가 없는 경우 "확인"을 클릭합니다.

   이미 이전에 SQL Server 2012를 설치했으므로, 구성을 변경하지 않았다면 큰 문제 없이 통과됩니다.

8.png

 

6. 프로세스 처리 메시지가 표시됩니다.

9.png

 

7. "지원 규칙 작업"이 완료되면, "다음"을 선택합니다.

10.png

 

8. 제품 키 입력 화면입니다. 정식 라이선스를 구매한 경우 이미 제품키가 입력되어 있으므로, 특별히 입력할 필요는 없습니다.

   다만, Command 창에서 별도로 수행하려면 해당 키를 알아야 합니다.

11.png

 

9. 소프트웨어 사용 동의에서 "동의함"을 체크하고, "다음"을 선택합니다.

12.png

 

10. 인스턴스를 선택합니다. SQL Server 2012만 설치되어 있고, 기본 인스턴스를 사용한 경우엔 "MSSQLSERVER"가 됩니다.

 저의 경우엔 SQL2012라는 인스턴스로 사용하여 다음과 같이 표시된 것입니다. "다음"을 선택합니다.

13.png

 

11. 버전 업그레이드 규칙을 확인합니다. 특별한 이상이 없을 경우 "다음"을 선택합니다.

14.png

 

** 업그레이드하려는 버전이 지원되는 버전이어야 합니다. **

자세한 사항은 다음 URL에서 확인할 수 있습니다. : http://msdn.microsoft.com/ko-kr/library/ms143393.aspx

 

12. 최종적으로 업그레이드 준비상태를 확인하고, "업그레이드" 버튼을 선택합니다.

15.png

 

13. 업그레이드가 완료되면 다음과 같은 화면이 표시됩니다. 만약 오류가 발생한 경우,

  12.번 단계에서 표시된 구성 파일 경로에서의 로그를 찾아 분석합니다.

16.png

 

14. 이제 SQL Server Management Studio를 실행하여 버전을 확인하면 다음과 같습니다.

17.png

 

오홋. 성공입니다.

 

** 참고로  Command 창에서 업그레이드를 진행하려면

   Setup.exe /q /ACTION=editionupgrade /INSTANCENAME=<Instance Name> /PID=<PID key for new edition> 를 수행하면 됩니다.

  > <Instance Name> : SQL Server 2012를 설치할 때 지정한 인스턴스명입니다. 특별히 지정하지 않으면  "MSSQLSERVER" 입니다.

  > <PID key for new edition> : 제품키 입니다. 위 GUI 설정에서는 8.번에 나온 제품키 입니다.

 

SQL Server 2008 은 다음 URL을 참고하세요.

 

* SQL2K8 평가판에서 정품으로 업그레이드 하는 방법
http://blogs.technet.com/b/koreapartner/archive/2009/03/04/sql2k8.aspx

 

쓸만한게없네 윤선식입니다.

 

Application 구문을 분석하려고 하다 보면, 한 줄로 너무 길게 있어서 보기가 어려운 경우가 많죠. 이러한 것을 알흠답게(?) 해 주는 기능이 Format-SQL 인데요

Orange와 같은 상용 툴은 기본으로 SQL 구문을 다음 그림처럼 해 주는 기능을 제공합니다.

1.png

[그림 1] Orange 에서 원본 구문

2.png

[그림 2] Orange에서 Formatting 적용 후

 

하지만, 강력하면서도 무료인 SQL Server Management Studio에는 이 기능이 없습니다.

하여, 이러한 기능을 제공하는 다른 툴이나 웹사이트를 찾아보기로 했습니다.

다만, Editplus Notepad++ 등의 에디터에 플러그인 형태로 제공되거나, 별도의 Windows Program으로 제공되는 것은 제외하고,

웹사이트에서 제공되는 형태와 SSMS Plugin 형태로 제공되는 것만 추려 봅니다.

 

1.     Web에서 바로 제공되는 형태

가장 간단하면서도 특별한 툴을 설치하지 않아도 되는 형태입니다.

A.    Gudu software 에서 제공하는 Instant SQL Formatter

http://www.dpriver.com/pp/sqlformat.htm

3.png

[그림 3] dpriver 웹 사이트의 Free SQL Formatter

위 그림과 같이 “Format SQL” 버튼을 누르면 자동으로 변경되고, 키워드, 테이블, 컬럼 등도 지정이 가능할 뿐 아니라 Database SQL Server 뿐 아니라 Oracle, DB, MySQL 등 대부분의 DBMS를 지원하는 강력한 사이트입니다.

게다가, 무료 사이트

게다가, 아래 그림처럼 HTML Tag까지 지원한다는 점~

4.png

[그림 4] Free SQL Formatter HTML 제공 기능

이 사이트에서 제공하는 SSMS Plugin 도 있으나 뒤에 설명하겠습니다.

 

B.     Poorsql 에서 제공하는 Instant Free and Open SQL Formatter

http://poorsql.com/

5.png

[그림 5] Poor SQL Instant Formatter

이 또한 즉석에서 변경해 주고, 각종 옵션을 바로 지정할 수 있습니다.

SQL Server 구문만 해당됩니다.

이 사이트에서 제공하는 SSMS Plugin 도 있으나 뒤에 설명하겠습니다.

 

C.     Andi Albrecht 개발 Instant SQL Formatter

http://sqlformat.appspot.com/

6.png

[그림 6] appspot.com SQL Formatter

많은 설정이 필요 없이 그대로 변경해 주고, 다른 것과 달리 file upload 기능을 제공합니다.

게다가 sample도 제공되어 어떻게 변경되는 지 미리 볼 수 있습니다.

 

2.     SQL Server Management Studio Add in 형태

A.     SQL Pretty Printer Add-In for SSMS V3.3.0 (쉐어웨어)

http://www.dpriver.com/dlaction.php?PHPSESSID=eb6fec56752b98d1d433ad6b70a7a66e

SQL Server 2005/2008/2012 SSMS를 지원합니다.

쉐어웨어이므로, 60일간의 Trial을 지원합니다.

해당 사이트에서 파일을 다운로드 받아서 압축 해제 후 설치하시면 됩니다.

7.png

[그림 7] SQL Pretty Printer Add-In이 설치된 형태

 

Format SQL을 실행하면 다음과 같이 정렬이 됩니다.

8.png

[그림 8] SQL Pretty Printer Format SQL 실행 후

 

, 쉐어웨어이므로 다음과 같이, 메시지가 뜹니다. 막강한 기능을 가지고 있어도요.

9.png

[그림 9] SQL Pretty Printer 구매 알림.

 

B.      T-SQL Tidy SQL Server Management Studio (SSMS) 2008 Add-in.

http://www.tsqltidy.com/tsqltidySSMSAddin.aspx

SQL Server 2008 R2 까지 지원합니다.

파일을 다운로드 받아서 Setup.exe를 통해 설치하면, SSMS에서 다음 툴바 및 도구에 추가된 메뉴를 확인할 수 있습니다.

10.png

[그림 10] T-SQL Tidy 설치 후 추가된 툴바

 

11.png

[그림 11] T-SQL Tidy 설치 후 추가된 도구 메뉴

 

또 하나의 특징은, 옵션이 엄청나게 많다는 점입니다.

12.png

[그림 12] T-SQL Tidy Scripting Options

결과는 다음과 같습니다.

13.png

[그림 13] T-SQL Tidy Formatting 결과

 

다만, 아직 베타 버전이라 그런 지 삭제가 잘 되지 않고, 간혹 다른 모듈을 찾는 버그가 발견됩니다.

 

C.      Poor Man’s T-SQL Formatter

http://architectshack.com/PoorMansTSqlFormatter.ashx#Download_8

해당 사이트를 들어가서 구경하는 것만으로도 T-SQL Formatting에 대해 공부할 수 있습니다.

중간 쯤에 위치한 Download에서 SqlFormatterSSMSAddIn.Setup.1.3.1.msi 파일을 받아서 설치할 수 있습니다. 설치가 끝나면 도구상자에 새로운 두 개의 메뉴가 생깁니다.

14.png

[그림 14] Poor Man’s T-SQL Formatter 설치 후 도구상자

 

SQL Server 2008 R2 SSMS에서는 설치만으로 바로 사용이 가능하지만,

SQL Server 2012 SSMS에서는 다음과 같이 수동으로 복사해 주셔야 사용이 가능합니다.

 C:\Users\Public\Documents\microsoft\MSEnvShared\AddIns폴더의 PoorMansTSqlFormatterSSMSAddIn.AddIn 파일을

 

C:\Users\[사용자명]\AppData\Roaming\Microsoft\MSEnvShared\Addins 여기로 복사해 주셔야 합니다.

 

      T-SQL Formatting Options을 다음과 같이 제공합니다.

15.png

[그림 15] Poor Man’s T-SQL Formatter 옵션

개인적으로 단축키를 마음대로 할 수 있다는 부분이 가장 맘에 들었고, 저는 Ctrl+K Ctrl+F Ctrl+K Ctrl+H 로 변경했습니다.

변경 결과는 다음과 같습니다.

16.png

[그림16] Poor Man’s T-SQL Formatting 결과

 

3.     기타 참고 사이트

A.     http://fsqlf.sourceforge.net/

Open Source 제공, command 형태로 진행

B.      http://www.dpriver.com/

위에서 이미 설명한 사이트 다른 툴이나 사이트도 제공하지만, 데스크탑 버전이나, API, 그리고 Visual Studio API도 제공합니다.

C.      http://www.tsqltidy.com/Default.aspx

위에서 설명한 T-SQL Tidy의 홈페이지이면서 웹 사이트에서 직접 바꿀 수 있는 페이지입니다.

D.     http://www.tsqltidy.com/SQLVersionControl.aspx

“C”와 같은 페이지이지만, SQL Version Control을 다운로드할 수 있습니다.

 

제목과 같이 지극히 주관적이므로, 사용하시는 분들에 따라 호불호가 갈릴 수 있습니다. 편한 대로 사용하시고.

또한, SSMS Addin의 경우 다른 프로그램과 충돌이 있거나 제거가 잘 안 될 수도 있습니다.

주의해 주세요.

 

아래 사이트에서 Free eBook 을 받으실 수 있어요.

 

 

단, 한글은 아니라는 점~~~.

 

http://f5debug.net/2011/10/12/free-ebook-download-sql-server-integration-services-ssis-step-by-step-tutorials-version-2-0/

+ Recent posts