다음을 통해 공유


sys.dm_exec_query_stats(Transact-SQL)

캐시된 쿼리 계획에 대한 집계 성능 통계를 반환합니다. 이 뷰에는 캐시된 계획 내의 쿼리 문당 하나의 행이 포함되어 있습니다. 행의 유효 기간은 계획 자체와 연결되어 있습니다. 캐시에서 계획이 제거되면 이 뷰에서도 해당 행이 제거됩니다.

[!참고]

현재 서버에서 실행 중인 작업이 있을 경우 sys.dm_exec_query_stats의 초기 쿼리 결과가 정확하지 않을 수 있습니다. 쿼리를 다시 실행하면 보다 정확한 결과를 확인할 수 있습니다.

열 이름

데이터 형식

설명

sql_handle

varbinary(64)

쿼리가 속하는 일괄 처리 또는 저장 프로시저를 참조하는 토큰입니다.

sql_handlestatement_start_offsetstatement_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)

쿼리 실행 계획에서 계산되는 이진 해시 값으로, 비슷한 쿼리 실행 계획을 식별하는 데 사용됩니다. 쿼리 계획 해시를 사용하여 비슷한 실행 계획을 가진 쿼리의 누적 비용을 찾을 수 있습니다. 자세한 내용은 쿼리 및 쿼리 계획 해시를 사용하여 비슷한 쿼리 검색 및 튜닝를 참조하십시오.

사용 권한

서버에 대한 VIEW SERVER STATE 권한이 필요합니다.

주의

쿼리가 완료되면 뷰의 통계가 업데이트됩니다.

1. TOP N 쿼리 찾기

다음 예에서는 평균 CLR 시간을 기준으로 상위 5개의 쿼리에 대한 정보를 반환합니다. 이 예에서는 논리적으로 동일한 쿼리를 누적 리소스 소비량에 따라 그룹화할 수 있도록 쿼리 해시에 따라 쿼리를 집계합니다.

USE AdventureWorks;
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