쿼리 매개변수화 확인하기

 

  • 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 SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 21874
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 12245
1894 SQL Server에서 Drop 및 Delete 사용자 찾기 jevida(강성욱) 2016.10.12 1697
1893 SQL Server 트랜잭션 로그 읽기 jevida(강성욱) 2016.10.12 2260
1892 MaxBCPThreads에 따른 BCP 병렬출력 jevida(강성욱) 2016.10.11 1110
1891 확장이벤트와 dm_os_wait_stats 대기유형 매핑 jevida(강성욱) 2016.10.11 1948
1890 장기 트랜잭션 확인 및 경고 설정 jevida(강성욱) 2016.10.11 1514
1889 SQL 데이터 수집툴 DiagManager 사용법 jevida(강성욱) 2016.10.11 1372
1888 Windows Server 2012 R2 그룹 관리 서비스 계정 및 SQL 서버 jevida(강성욱) 2016.10.11 1880
1887 Kerbros 구성 관리자 툴 jevida(강성욱) 2016.10.11 1210
1886 SQL Server Geography 및 Geometory 데이터 형식 jevida(강성욱) 2016.10.11 2696
1885 SQL Server를 이용한 신용카드 보안 -조직이 PCI DSS 준수를 달성 하기 위한 요건 jevida(강성욱) 2016.10.11 1411
1884 TDE 암호화 사용하기 jevida(강성욱) 2016.10.11 3744
1883 SQL Server 암호화 하기 jevida(강성욱) 2016.10.11 2873
1882 의도하지 않은 분산트랜잭션 사용 jevida(강성욱) 2016.10.11 955
1881 Affinity I/O Mask jevida(강성욱) 2016.10.11 1214
1880 LPE_BATCH 스핀락 jevida(강성욱) 2016.10.11 914
1879 SQL Server 17953 오류 jevida(강성욱) 2016.10.11 1055
1878 SQL 연결 18056 오류 jevida(강성욱) 2016.10.11 1454
1877 SQL 2008 R2 Sp1 적용과 9013 오류 - 포맷 섹터 크기에 따른 오류 jevida(강성욱) 2016.10.11 2010
1876 JDBC 로깅 파일 위치 설정 jevida(강성욱) 2016.10.11 994
1875 NUMA Node 메모리 블록 jevida(강성욱) 2016.10.11 1068





XE Login