sys.dm_exec_query_stats(Transact-SQL)
캐시된 쿼리 계획에 대한 집계 성능 통계를 반환합니다. 이 뷰에는 캐시된 계획 내의 쿼리 문당 하나의 행이 포함되어 있습니다. 행의 유효 기간은 계획 자체와 연결되어 있습니다. 캐시에서 계획이 제거되면 이 뷰에서도 해당 행이 제거됩니다.
[!참고]
현재 서버에서 실행 중인 작업이 있을 경우 sys.dm_exec_query_stats의 초기 쿼리 결과가 정확하지 않을 수 있습니다. 쿼리를 다시 실행하면 보다 정확한 결과를 확인할 수 있습니다.
열 이름 |
데이터 형식 |
설명 |
---|---|---|
sql_handle |
varbinary(64) |
쿼리가 속하는 일괄 처리 또는 저장 프로시저를 참조하는 토큰입니다. sql_handle은 statement_start_offset 및 statement_end_offset과 함께 사용되어 sys.dm_exec_sql_text 동적 관리 함수를 호출하여 쿼리의 SQL 텍스트를 검색할 수 있습니다. |
statement_start_offset |
int |
0부터 시작하여 일괄 처리 또는 지속형 개체의 텍스트 내에서 행이 설명하는 쿼리의 시작 위치(바이트)를 나타냅니다. |
statement_end_offset |
int |
0부터 시작하여 일괄 처리 또는 지속형 개체의 텍스트 내에서 행이 설명하는 쿼리의 끝 위치(바이트)를 나타냅니다. 값이 -1인 경우 일괄 처리의 끝을 나타냅니다. |
plan_generation_num |
bigint |
다시 컴파일한 후 계획의 인스턴스 간을 서로 구별하는 데 사용될 수 있는 시퀀스 번호입니다. |
plan_handle |
varbinary(64) |
쿼리가 속하는 컴파일된 계획을 참조하는 토큰입니다. 이 값은 sys.dm_exec_query_plan 동적 관리 함수로 전달되어 쿼리 계획을 가져올 수 있습니다. |
creation_time |
datetime |
이 계획이 컴파일된 시간입니다. |
last_execution_time |
datetime |
이 계획이 마지막으로 실행되기 시작한 시간입니다. |
execution_count |
bigint |
이 계획이 마지막으로 컴파일된 이후 실행된 횟수입니다. |
total_worker_time |
bigint |
이 계획이 컴파일된 이후 실행되는 데 사용된 총 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
last_worker_time |
bigint |
이 계획이 마지막으로 실행되었을 때 사용된 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
min_worker_time |
bigint |
단일 실행 중에 이 계획이 사용한 최소 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
max_worker_time |
bigint |
단일 실행 중에 이 계획이 사용한 최대 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
total_physical_reads |
bigint |
이 계획이 컴파일된 이후 실행될 때 수행된 총 물리적 읽기 수입니다. |
last_physical_reads |
bigint |
이 계획이 마지막으로 실행되었을 때 수행된 물리적 읽기 수입니다. |
min_physical_reads |
bigint |
단일 실행 중 이 계획에서 수행한 최소 물리적 읽기 수입니다. |
max_physical_reads |
bigint |
단일 실행 중 이 계획에서 수행한 최대 물리적 읽기 수입니다. |
total_logical_writes |
bigint |
이 계획이 컴파일된 이후 실행될 때 수행된 총 논리적 쓰기 수입니다. |
last_logical_writes |
bigint |
이 계획이 마지막으로 실행되었을 때 수행된 논리적 쓰기 수입니다. |
min_logical_writes |
bigint |
단일 실행 중 이 계획에서 수행한 최소 논리적 쓰기 수입니다. |
max_logical_writes |
bigint |
단일 실행 중 이 계획에서 수행한 최대 논리적 쓰기 수입니다. |
total_logical_reads |
bigint |
이 계획이 컴파일된 이후 실행될 때 수행된 총 논리적 읽기 수입니다. |
last_logical_reads |
bigint |
이 계획이 마지막으로 실행되었을 때 수행된 논리적 읽기 수입니다. |
min_logical_reads |
bigint |
단일 실행 중 이 계획에서 수행한 최소 논리적 읽기 수입니다. |
max_logical_reads |
bigint |
단일 실행 중 이 계획에서 수행한 최대 논리적 읽기 수입니다. |
total_clr_time |
bigint |
이 계획이 컴파일된 이후 실행될 때 Microsoft .NET Framework CLR(공용 언어 런타임) 개체 내에서 사용한 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. CLR 개체는 저장 프로시저, 함수, 트리거, 유형 및 집계일 수 있습니다. |
last_clr_time |
bigint |
이 계획을 마지막으로 실행하는 동안 .NET Framework CLR 개체 내에서 실행에 사용한 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. CLR 개체는 저장 프로시저, 함수, 트리거, 유형 및 집계일 수 있습니다. |
min_clr_time |
bigint |
단일 실행 중에 .NET Framework CLR 개체 내에서 이 계획이 사용한 최소 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. CLR 개체는 저장 프로시저, 함수, 트리거, 유형 및 집계일 수 있습니다. |
max_clr_time |
bigint |
단일 실행 중에 .NET Framework CLR 내에서 이 계획이 사용한 최대 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. CLR 개체는 저장 프로시저, 함수, 트리거, 유형 및 집계일 수 있습니다. |
total_elapsed_time |
bigint |
이 계획의 실행을 완료하는 데 소요된 총 경과 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
last_elapsed_time |
bigint |
이 계획의 실행을 가장 최근에 완료하는 데 소요된 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
min_elapsed_time |
bigint |
이 계획의 실행을 완료하는 데 소요된 최소 경과 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
max_elapsed_time |
bigint |
이 계획의 실행을 완료하는 데 소요된 최대 경과 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다. |
query_hash |
binary(8) |
쿼리에서 계산되는 이진 해시 값으로, 비슷한 논리를 가진 쿼리를 식별하는 데 사용됩니다. 쿼리 해시를 사용하여 리터럴 값만 다른 쿼리에 대한 집계 리소스 사용을 확인할 수 있습니다. 자세한 내용은 쿼리 및 쿼리 계획 해시를 사용하여 비슷한 쿼리 검색 및 튜닝를 참조하십시오. |
query_plan_hash |
binary(8) |
쿼리 실행 계획에서 계산되는 이진 해시 값으로, 비슷한 쿼리 실행 계획을 식별하는 데 사용됩니다. 쿼리 계획 해시를 사용하여 비슷한 실행 계획을 가진 쿼리의 누적 비용을 찾을 수 있습니다. 자세한 내용은 쿼리 및 쿼리 계획 해시를 사용하여 비슷한 쿼리 검색 및 튜닝를 참조하십시오. |
total_rows |
bigint |
쿼리에서 반환한 총 행 수입니다. Null일 수 없습니다. |
last_rows |
bigint |
마지막 실행 쿼리에서 반환한 행 수입니다. Null일 수 없습니다. |
min_rows |
bigint |
마지막으로 컴파일된 이후 계획이 실행된 횟수 이상으로 쿼리에서 반환한 최소 행 수입니다. Null일 수 없습니다. |
max_rows |
bigint |
마지막으로 컴파일된 이후 계획이 실행된 횟수 이상으로 쿼리에서 반환한 최대 행 수입니다. Null일 수 없습니다. |
사용 권한
서버에 대한 VIEW SERVER STATE 권한이 필요합니다.
주의
쿼리가 완료되면 뷰의 통계가 업데이트됩니다.
예
1. TOP N 쿼리 찾기
다음 예에서는 평균 CLR 시간을 기준으로 상위 5개의 쿼리에 대한 정보를 반환합니다. 이 예에서는 논리적으로 동일한 쿼리를 누적 리소스 소비량에 따라 그룹화할 수 있도록 쿼리 해시에 따라 쿼리를 집계합니다.
USE AdventureWorks2008R2;
GO
SELECT TOP 5 query_stats.query_hash AS "Query Hash",
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
MIN(query_stats.statement_text) AS "Statement Text"
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(ST.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
GO
B. 쿼리에 대한 행 개수 집계 반환
다음 예에서는 쿼리에 대한 행 개수 집계 정보(합계 행, 최소 행, 최대 행 및 마지막 행)를 반환합니다.
SELECT qs.execution_count,
SUBSTRING(qt.text,qs.statement_start_offset/2 +1,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2
ELSE qs.statement_end_offset end -
qs.statement_start_offset
)/2
) AS query_text,
qt.dbid, dbname= DB_NAME (qt.dbid), qt.objectid,
qs.total_rows, qs.last_rows, qs.min_rows, qs.max_rows
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.text like '%SELECT%'
ORDER BY qs.execution_count DESC;