쿼리 매개변수화 확인하기
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server를 업그레이드 하였는데 성능이 느려졌다? 무슨 일이 발생한 것일까? 쿼리가 느려진 원인과 실행된 쿼리가 매개변수화 되었는지 확인하는 방법에 대해서 알아보자.
이 포스트는 CSS SQL Server Engineers 블로그에 게시된 내용으로 필자가 읽고 이해한 내용을 정리하였다. 번역의 오류나 기술적 오류 가능성을 미리 알려두며 자세한 내용은 원문을 참고 하길 바란다.
우선 이 글을 읽기 전에 매개변수화에 대해서 알아보도록 하자. 매개변수화는 다음 아티클을 참고 한다.
- 단순 매개 변수화 : http://sqlmvp.kr/140189013252
- 강제 매개 변수화 : http://sqlmvp.kr/140189090317
이번 사례는 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 사용을 고려하였으나 다른 쿼리에 영향이 생길 수도 있으므로 힌트적용은 하지 않았다.
이 외에도 매개변수화로 인한 성능 저하 사례를 살펴보자.
- 매개변수 값의 변경과 SQL 서버 성능 저하 : http://sqlmvp.kr/140193296636
- 매개 변수 및 실행 계획 재사용 : http://sqlmvp.kr/140188831357
- 강제 매개변수화로 인한 성능저하 사례 : http://sqlmvp.kr/140197059806
- SQL Server 커넥션 풀링: http://sqlmvp.kr/140198995563
[참고자료]
http://blogs.msdn.com/b/psssql/archive/2013/12/04/how-simple-parameterization-work.aspx
2013-12-06 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
트랜잭션 로그 여유 공간 모니터링 (0) | 2015.07.23 |
---|---|
SQL Server가 서비스 격리를 처리하는 방법 (0) | 2015.07.23 |
SQL Server에서 Drop 및 Delete 사용자 찾기 (0) | 2015.07.23 |
SQL Server 트랜잭션 로그 읽기 (0) | 2015.07.23 |
MaxBCPThreads에 따른 BCP 병렬출력 (0) | 2015.07.23 |