성능분석 12탄 – 문제 쿼리 식별

 

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

 

SQL Server에서는 sys.dm_exec_query_stats DMV를 사용하여 실행된 쿼리에 대한 통계를 확인 할 수 있다. DMV에서는 몇 개의 쿼리가 실행 되었는지, 전체, 최대, 최소. 마지막 활성 CPU 시간 등을 확인 할 수 있으며 전체, 최대, 최소, 마지막 읽기 쓰기에 대한 정보를 확인 할 수 있어 문제를 식별하는데 매우 좋은 정보이다.

select* from sys.dm_exec_query_stats

 

 

Large execute count

많은 실행 횟수는 자주 실행되는 쿼리로 성능에 가장 민감하다. 빈도가 높은 만큼 작은 개선이 전반적으로 상당한 성능에 이점을 가져올 수 있다.

 

 

Large logical reads

많은 논리적 읽기는 많은 양의 데이터를 검색하기 때문에 느린 쿼리일 가능성이 높다. 데이터 스캔이나 미싱인덱스 문제일 수 있다. 논리적 읽기가 높은 것은 긴 작업타임 이슈이지 CPU 이슈는 아니다. 통계가 오래되거나 잘못된 실행 계획, 잘못된 모델 설계, 인덱스 누락 등으로도 발생 할 수 있다.

 

 

Large Physical reads

큰 물리적 읽기는 논리적 읽기와 같은 문제이지만 추가적으로 서버에 충분한 RAM이 없음을 나타낸다. 다행이 이런 문제는 RAM을 추가하면 해결되는 쉬운 케이스이다. 하지만 여전히 큰 논리적 읽기는 발생 할 수 있다.

 

 

High worker time with low logical reads

높은 작업 시간과 낮은 논리적 읽기 현상은 흔하지 않지만 발생하는 현상이다. 이는 적은 데이터를 처리하기 위해서도 높은 CPU를 사용하는 작업을 나타낸다. 문자열 처리 및 XML 처리 등이 일반적으로 높은 CPU를 요구한다.

 

 

High elapsed time with log worker time

쿼리 작업 시간이 오래 걸리며 CPU 사이클을 활용하는 쿼리 차단을 나타낸다. 이는 뭔가를 기다리는 것에 병렬 처리에서 다른 스레드 처리 결과를 기다리는데 대부분의 시간을 소비 한다.

 

 

High total rows count

큰 결과 행을 요청하는 것은 어플리케이션 설계 문제에서 해결 해야 한다. 꼭 필요한 데이터만 가져 올 수 있도록 요구하는 것이 좋다. 문제가 되는 쿼리를 찾기 위해서는 DMV sys.dm_exec_query_stats을 사용 할 수 있으며 쿼리 텍스트 및 실행 계획을 함께 확인 하기 위해 sys.dm_exec_sql_text, sys.dm_exec_query_plan 을 조인하여 정보를 확인 할 수 있다.

 

select st.text,

    pl.query_plan,

    qs.*

    from sys.dm_exec_query_stats qs

    cross apply sys.dm_exec_sql_text(qs.sql_handle) as st

    cross apply sys.dm_exec_query_plan(qs.plan_handle) as pl;

 

 

 

[참고자료]

http://rusanu.com/2014/02/24/how-to-analyse-sql-server-performance/

 

 



강성욱 / 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 38110
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 20672
1954 FileStream Garbage Collection jevida(강성욱) 2016.10.18 3509
1953 프로시저 캐시에서 중복 쿼리 계획 확인 jevida(강성욱) 2016.10.18 3753
1952 Sp_reset_connection jevida(강성욱) 2016.10.18 3825
1951 성능분석 17탄 – SQLServer 블록킹 / 네트워크 관련 성능 카운터 jevida(강성욱) 2016.10.15 3810
1950 성능분석 16탄 – 메모리 / CPU 관련 성능 카운터 jevida(강성욱) 2016.10.15 6252
1949 성능분석 15탄 – I/O 관련 성능 카운터 jevida(강성욱) 2016.10.15 4090
1948 성능분석 14탄 – SQL Server 사용 성능 카운터 jevida(강성욱) 2016.10.15 4073
1947 성능분석 13탄 – 누락된 인덱스(missing index) jevida(강성욱) 2016.10.15 2466
» 성능분석 12탄 – 문제 쿼리 식별 jevida(강성욱) 2016.10.15 2285
1945 성능분석 11탄 – 실행 계획 분석 jevida(강성욱) 2016.10.15 4304
1944 성능분석 10탄 – 쿼리 실행 대기 시간 분석(xevent) jevida(강성욱) 2016.10.15 2012
1943 성능분석 9탄 – 쿼리 실행 분석 jevida(강성욱) 2016.10.15 4236
1942 성능분석 8탄 – IO 통계 (DISK 활동 분석) jevida(강성욱) 2016.10.15 1520
1941 성능분석 7탄 – 프로파일러 대기 유형 및 PREEMPTIVE_OS_WRITEFILEGATHER jevida(강성욱) 2016.10.15 1800
1940 성능분석 6탄 – CPU 경합 및 동시성 관련 대기 유형 jevida(강성욱) 2016.10.15 1977
1939 성능분석 5탄 – 메모리 및 네트워크 관련 대기 유형 jevida(강성욱) 2016.10.15 2163
1938 성능분석 4탄 – 디스크 및 IO 관련 대기 유형 jevida(강성욱) 2016.10.15 2372
1937 성능분석 3탄 – 집계 대기 통계 jevida(강성욱) 2016.10.15 2023
1936 성능분석 2탄 – 실행 요청을 기다리는 작업 확인 및 분석 (병렬 처리 대기 확인) jevida(강성욱) 2016.10.15 1449
1935 성능분석 1탄 – 실행 요청을 기다리는 작업 확인 및 분석 jevida(강성욱) 2016.10.15 2147





XE Login