SQL Server Plan Guide 생성 및 사용

 

  • Version : SQL Server 2005, 2008, 2008R2, 2012

 

회사에서 사용하는 응용프로그램이 내가 운영하고 있는 데이터베이스에 쿼리를 호출 한다. 이 때일부 특정 쿼리가 매우 느리게 실행 되는 것을 확인 하였다. 하지만 나는 응용 프로그램의 코드를 수정 할 수 없다. 어떻게 쿼리 최적화를 할 수 있을까?

 

위의 상황은 우리가 일반적으로 말하는 웹 서버, 또는 기타 응용프로그램에서 Ad-hoc 쿼리를 호출하였을 때 발생하는 문제이다. 물론 해당 프로그램을 만든 담당자에게 이슈를 전달하여 쿼리를 수정 할 수도 있지만 외부 제품을 구입한 경우에는 이 또한 쉽지 않다.

 

어떻게 하면 느린 쿼리의 성능을 올릴 수 있을까? Plan Guide를 사용하여 ad-hoc 쿼리 실행 시 힌트를 적용 할 수 있는 방법을 알아 보자.

 

SQL Server 2005부터 Plan Guide 라는 기능이 추가 되었다. 이것은 프로시저에 속한 쿼리나 ad-hoc 쿼리에 대하여 해당 쿼리가 실행될 때 필요한 실행 계획을 가이드 할 수 있게 한다.

 

생성할 수 있는 Plan Guide는 3종류가 있다.

  • Object plan guide : 저장프로시저, 펑션, 트리거에 가이드 사용
  • SQL Plan Guide : CLR, 확정 저장프로시저, 동적 SQL 등에 가이드 사용
  • Template Plan Guide : 지정된 양식에 parameterization 옵션을 override 할 때 사용.

 

자세한 내용은 MSDN을 참고 한다.

관련 링크 : http://msdn.microsoft.com/en-us/library/ms189854(SQL.90).aspx

 

대부분의 경우에는 옵티마이저가 플랜을 작성하도록 하는 것이 좋다. 하지만 일부 경우에는 옵티마이저가 최적화된 플랜을 생성하지 못할 때 DBA가 최적화 플랜을 작성하여 플랜을 강제 유도 할 수 있다.

 

실습을 통해서 Plan Guide 생성 및 사용법을 알아 보자.

 

다음의 예제 스크립트를 실행 하여 보자.

EXEC sp_executesql

@stmt = N'SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID',

@params = N'@ProductID int', @ProductID = 870

GO

EXEC sp_executesql

@stmt = N'SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID',

@params = N'@ProductID int', @ProductID = 897

GO

 

 

첫 번째 쿼리문에서는 옵티마이저가 최적의 플랜을 통하여 전체 121317 행을 조회하여 4688행을 나타내었다.

두 번째 쿼리문에서는 쿼리문1과 동일한 플랜으로 2건을 조회 하였다. 쿼리2의 경우에는 조건 탐색에 의하여 탐색이 더 나은 대안이 될 수 있다.

 

DBA는 recompile 옵션을 사용하여 새로운 플랜을 생성하고 싶다. Plan Guide에 recompile 옵션을 추가해서 생성해 보자.

EXEC sp_create_plan_guide

@name = N'GETSALESPRODUCTS_RECOMPILE_Fix',

@stmt = N'SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = @ProductID',

@type = N'SQL',

@module_or_batch = NULL,

@params = N'@ProductID int',

@hints = N'OPTION (RECOMPILE)'

GO

 

 

 

플랜 생성이 완료 되었다. 처음과 동일한 쿼리문을 실행 하여 보자. 이 때 플랜 가이드가 잘 사용되고 있는지 확인하기 위하여 프로파일러를 이용하여 확인 하였다. 첫 번째 쿼리의 경우에는 최적화된 플랜으로 인덱스 스캔을 실행 하였고 두 번째 쿼리의 경우에는 인덱스 탐색을 진행한 것을 확인 할 수 있다.

 

 

프로파일러를 통해서 확인해 보면 SET STATISTICS XML ON 문이 호출 되었다. 플랜가이드를 활용한 것을 확인 할 수 있다.

 

 

생성된 플랜을 확인하는 방법에는 다음의 스크립트를 이용하여 확인 할 수 있다.

select * from sys.plan_guides

 

 

 

쿼리 플랜이 설정되어 있는 프로시저의 경우 삭제 및 수정이 불가능 하다. 쿼리 플랜의 삭제는 다음 스크립트를 실행 한다.

EXEC sp_control_plan_guide N'DROP', N'GETSALESPRODUCTS_RECOMPILE_Fix'

GO

 

 

Plan Guide는 옵티마이저의 선택에 영향을 미치므로 데이터베이서의 특성 및 비즈니스 환경을 잘 알며 매우 구체적인 상황일 때 신중하게 사용하여야 한다.

 

[참고 자료]

http://www.mssqltips.com/sqlservertip/1630/how-to-use-a-sql-server-plan-guide-to-tune-queries/

 



강성욱 / jevida@naver.com

Microsoft SQL Server MVP

Blog : http://sqlmvp.kr

Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 38045
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20666
» SQL Server Plan Guide 생성 및 사용 jevida(강성욱) 2016.09.14 1553
1733 SQL Server 그래픽 실행 계획 노드 정보 jevida(강성욱) 2016.09.14 1138
1732 프로파일러를 이용한 실행계획 캡처하기 jevida(강성욱) 2016.09.14 1009
1731 SQL Server 그래픽 실행 계획 및 텍스트 실행 계획 jevida(강성욱) 2016.09.14 3269
1730 SQL Server에서 Trigger 활성 / 비활성 감시 jevida(강성욱) 2016.09.14 1695
1729 DDL Trigger를 이용한 데이터베이스 변경 사항 추적 jevida(강성욱) 2016.09.14 1442
1728 Trigger를 이용한 SQL Server 커넥션 풀링 확인 jevida(강성욱) 2016.09.14 1139
1727 SQL Server Trigger jevida(강성욱) 2016.09.14 1004
1726 인덱스에 대한 SORT_IN_TEMPDB 옵션 jevida(강성욱) 2016.09.14 915
1725 인덱스 DDL 작업의 디스크 공간 요구 사항 jevida(강성욱) 2016.09.14 974
1724 XML nodes() 함수를 이용한 OPENXML 교체 jevida(강성욱) 2016.09.14 1129
1723 XQuery를 사용한 XML 데이터 업데이트 jevida(강성욱) 2016.09.14 2016
1722 BCP XML 파일 형식 jevida(강성욱) 2016.09.14 1329
1721 SQL Server로 데이터 가져오기 jevida(강성욱) 2016.09.14 1364
1720 SQL Server Stored Procedure 암호화 jevida(강성욱) 2016.09.14 2824
1719 SQL Server 대칭키 vs 비대칭키 암호화 jevida(강성욱) 2016.09.14 1784
1718 SQL Server 마스터 키 관리 jevida(강성욱) 2016.09.14 2070
1717 대칭키를 사용하여 SQL Server 암호화(열 수준) 하기 jevida(강성욱) 2016.09.13 5938
1716 DMV를 사용하여 누락된 인덱스 확인 jevida(강성욱) 2016.09.13 1426
1715 DMV를 이용한 SQL Server 대기 상태 확인 jevida(강성욱) 2016.09.13 4482





XE Login