데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

쿼리 매개변수화 확인하기

 

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

 

SQL Server를 업그레이드 하였는데 성능이 느려졌다? 무슨 일이 발생한 것일까? 쿼리가 느려진 원인과 실행된 쿼리가 매개변수화 되었는지 확인하는 방법에 대해서 알아보자.

 

이 포스트는 CSS SQL Server Engineers 블로그에 게시된 내용으로 필자가 읽고 이해한 내용을 정리하였다. 번역의 오류나 기술적 오류 가능성을 미리 알려두며 자세한 내용은 원문을 참고 하길 바란다.

 

우선 이 글을 읽기 전에 매개변수화에 대해서 알아보도록 하자. 매개변수화는 다음 아티클을 참고 한다.

 

 

이번 사례는 SQL Server 2005에서 2008로 업그레이드 후 성능이 저하되었던 사례이다. 원인은 매개 변수화로 인하여 업데이트마다 컴파일 과정 때문에 발생하였다. 쿼리가 매개 변수화 되었는지 확인하는 가장 쉬운 방법은 그래픽 XML 계획을 사용하는 것이다.

 

다음 예제 쿼리에서 T1테이블은 클러스터된 기본키 C1이 있다. 그리고 조건문에는 C1컬럼을 사용하였다.

update t1 set c1 = 12, c2 = 23 where c1 = 12

 

실행 계획에 매개변수가 발생한 경우 "Scalar Operator (CONVERT_IMPLICIT(int,..)" 또는 "Scalar Operator (@2)" 값으로 표시 된다.

 

매개 변수가 발생하지 않은 경우는 ""Scalar Operator (12)"와 같은 방법으로 표시된다.

 

 

쿼리 매개 변수화는 언제 발생하는지 알아 보자. 쿼리 실행 시 강제 매개 변수화를 설정하면 SQL Server는 문서화된 조건을 제외한 모든 쿼리를 매개 변수화 하려고 할 것이다.

 

단순 매개변수의 경우는 기본 동작에 따라 매개 변수화를 한다. XML계획에서 발생 여부를 확인할 수 있다.

 

XML 계획에서 아래 그림과 같이 "StatementOptmLevel" 항목에서 확인 할 수 있다. 이 항목이 StatementOptmLevel="FULL" 인 경우는 단순 매개 변수화가 되지 않은 것이다.

 

이 문제를 해결하기 위해서 쿼리 힌트인 PARAMETERIZATION FORCED 사용을 고려하였으나 다른 쿼리에 영향이 생길 수도 있으므로 힌트적용은 하지 않았다.

 

이 외에도 매개변수화로 인한 성능 저하 사례를 살펴보자.

 

 

[참고자료]

http://blogs.msdn.com/b/psssql/archive/2013/12/04/how-simple-parameterization-work.aspx

 

 



강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

No. Subject Author Date Views
1910 64비트 버전의 SQL Server 버퍼 풀 메모리 페이지 수 줄이는 방법 jevida(강성욱) 2016.10.12 2433
1909 누락된 공유 잠금 (Missing Shared Locks) jevida(강성욱) 2016.10.12 1560
1908 Ad Hoc Distributed Queries 옵션 jevida(강성욱) 2016.10.12 3045
1907 높은 MAXDOP은 쿼리를 느리게 만들 수 있는가? jevida(강성욱) 2016.10.12 1305
1906 변경된 테이블 이름 복구하기 jevida(강성욱) 2016.10.12 1290
1905 Sys,dm_exec_connections jevida(강성욱) 2016.10.12 1908
1904 SQL Server 시작 매개 변수 설정 jevida(강성욱) 2016.10.12 2479
1903 AFTER 트리거를 INSTEAD OF 트리거로 변경 후 효율성 향상 jevida(강성욱) 2016.10.12 1782
1902 쿼리 대기 옵션 jevida(강성욱) 2016.10.12 1564
1901 Index create memory 설정 jevida(강성욱) 2016.10.12 1230
1900 Min memory per query 옵션 jevida(강성욱) 2016.10.12 1677
1899 SQL Server 에디션 다운그레이드와 제한된 기능 확인 jevida(강성욱) 2016.10.12 2121
1898 Downgrade from SQL Server Ent to Std Edition jevida(강성욱) 2016.10.12 1336
1897 트랜잭션 로그 여유 공간 모니터링 jevida(강성욱) 2016.10.12 1342
1896 SQL Server가 서비스 격리를 처리하는 방법 jevida(강성욱) 2016.10.12 1144
» 쿼리 매개변수화 확인하기 jevida(강성욱) 2016.10.12 1428
1894 SQL Server에서 Drop 및 Delete 사용자 찾기 jevida(강성욱) 2016.10.12 1628
1893 SQL Server 트랜잭션 로그 읽기 jevida(강성욱) 2016.10.12 2067
1892 MaxBCPThreads에 따른 BCP 병렬출력 jevida(강성욱) 2016.10.11 1088
1891 확장이벤트와 dm_os_wait_stats 대기유형 매핑 jevida(강성욱) 2016.10.11 1883





XE Login