쿼리 매개변수화 확인하기

 

  • 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
Notice 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 528
1906 변경된 테이블 이름 복구하기 jevida(강성욱) 2016.10.12 1344
1905 Sys,dm_exec_connections jevida(강성욱) 2016.10.12 2008
1904 SQL Server 시작 매개 변수 설정 jevida(강성욱) 2016.10.12 2542
1903 AFTER 트리거를 INSTEAD OF 트리거로 변경 후 효율성 향상 jevida(강성욱) 2016.10.12 1902
1902 쿼리 대기 옵션 jevida(강성욱) 2016.10.12 1607
1901 Index create memory 설정 jevida(강성욱) 2016.10.12 1281
1900 Min memory per query 옵션 jevida(강성욱) 2016.10.12 1749
1899 SQL Server 에디션 다운그레이드와 제한된 기능 확인 jevida(강성욱) 2016.10.12 2147
1898 Downgrade from SQL Server Ent to Std Edition jevida(강성욱) 2016.10.12 1366
1897 트랜잭션 로그 여유 공간 모니터링 jevida(강성욱) 2016.10.12 1402
1896 SQL Server가 서비스 격리를 처리하는 방법 jevida(강성욱) 2016.10.12 1162
» 쿼리 매개변수화 확인하기 jevida(강성욱) 2016.10.12 1456
1894 SQL Server에서 Drop 및 Delete 사용자 찾기 jevida(강성욱) 2016.10.12 1648
1893 SQL Server 트랜잭션 로그 읽기 jevida(강성욱) 2016.10.12 2205
1892 MaxBCPThreads에 따른 BCP 병렬출력 jevida(강성욱) 2016.10.11 1103
1891 확장이벤트와 dm_os_wait_stats 대기유형 매핑 jevida(강성욱) 2016.10.11 1917
1890 장기 트랜잭션 확인 및 경고 설정 jevida(강성욱) 2016.10.11 1464
1889 SQL 데이터 수집툴 DiagManager 사용법 jevida(강성욱) 2016.10.11 1342
1888 Windows Server 2012 R2 그룹 관리 서비스 계정 및 SQL 서버 jevida(강성욱) 2016.10.11 1858
1887 Kerbros 구성 관리자 툴 jevida(강성욱) 2016.10.11 1186





XE Login