다음을 통해 공유


sys.dm_exec_query_stats(Transact-SQL)

 

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

참고

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

적용 대상: SQL Server (SQL Server 2008 ~ 현재 버전), Azure SQL 데이터베이스.

열 이름

데이터 형식

설명

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부터 시작하여 일괄 처리 또는 지속형 개체의 텍스트 내에서 행이 설명하는 쿼리의 끝 위치(바이트)를 나타냅니다.SQL Server 2014 이전의 버전에서 값이 -1인 경우 일괄 처리의 끝을 나타냅니다. 후행 주석을 더이상 포함하지 않습니다.

plan_generation_num

bigint

다시 컴파일한 후 계획의 인스턴스 간을 서로 구별하는 데 사용될 수 있는 시퀀스 번호입니다.

plan_handle

varbinary(64)

쿼리가 속하는 컴파일된 계획을 참조하는 토큰입니다. 이 값은 sys.dm_exec_query_plan 동적 관리 함수로 전달되어 쿼리 계획을 가져올 수 있습니다.

고유하게 컴파일된 저장 프로시저에서 메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0x000입니다.

creation_time

datetime

이 계획이 컴파일된 시간입니다.

last_execution_time

datetime

이 계획이 마지막으로 실행되기 시작한 시간입니다.

execution_count

bigint

이 계획이 마지막으로 컴파일된 이후 실행된 횟수입니다.

total_worker_time

bigint

이 계획이 컴파일된 이후 실행되는 데 사용된 총 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다.

고유하게 컴파일된 저장 프로시저의 경우 1초 미만이 소요되는 실행이 많으면 total_worker_time이 정확하지 않을 수 있습니다.

last_worker_time

bigint

이 계획이 마지막으로 실행되었을 때 사용된 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다.1

min_worker_time

bigint

단일 실행 중에 이 계획이 사용한 최소 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다.1

max_worker_time

bigint

단일 실행 중에 이 계획이 사용한 최대 CPU 시간(마이크로초 단위로 보고되지만 밀리초 단위까지만 정확함)입니다.1

total_physical_reads

bigint

이 계획이 컴파일된 이후 실행될 때 수행된 총 물리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

last_physical_reads

bigint

이 계획이 마지막으로 실행되었을 때 수행된 물리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

min_physical_reads

bigint

단일 실행 중 이 계획에서 수행한 최소 물리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

max_physical_reads

bigint

단일 실행 중 이 계획에서 수행한 최대 물리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

total_logical_writes

bigint

이 계획이 컴파일된 이후 실행될 때 수행된 총 논리적 쓰기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

last_logical_writes

bigint

계획이 마지막으로 실행될 때 변경된 버퍼 풀 페이지 수입니다. 페이지가 이미 변경된(수정된) 경우에는 쓰기 수가 계산되지 않습니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

min_logical_writes

bigint

단일 실행 중 이 계획에서 수행한 최소 논리적 쓰기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

max_logical_writes

bigint

단일 실행 중 이 계획에서 수행한 최대 논리적 쓰기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

total_logical_reads

bigint

이 계획이 컴파일된 이후 실행될 때 수행된 총 논리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

last_logical_reads

bigint

이 계획이 마지막으로 실행되었을 때 수행된 논리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

min_logical_reads

bigint

단일 실행 중 이 계획에서 수행한 최소 논리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

max_logical_reads

bigint

단일 실행 중 이 계획에서 수행한 최대 논리적 읽기 수입니다.

메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

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)

쿼리 실행 계획에서 계산되는 이진 해시 값으로, 비슷한 쿼리 실행 계획을 식별하는 데 사용됩니다. 쿼리 계획 해시를 사용하여 비슷한 실행 계획을 가진 쿼리의 누적 비용을 찾을 수 있습니다.

고유하게 컴파일된 저장 프로시저에서 메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0x000입니다.

total_rows

bigint

쿼리에서 반환한 총 이벤트 수입니다. null일 수 없습니다.

고유하게 컴파일된 저장 프로시저에서 메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

last_rows

bigint

마지막 실행 쿼리에서 반환한 행 수입니다. null일 수 없습니다.

고유하게 컴파일된 저장 프로시저에서 메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

min_rows

bigint

마지막으로 컴파일된 이후 계획이 실행된 횟수 이상으로 쿼리에서 반환한 최소 행 수입니다. null일 수 없습니다.

고유하게 컴파일된 저장 프로시저에서 메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

max_rows

bigint

마지막으로 컴파일된 이후 계획이 실행된 횟수 이상으로 쿼리에서 반환한 최대 행 수입니다. null일 수 없습니다.

고유하게 컴파일된 저장 프로시저에서 메모리 액세스에 최적화된 테이블을 쿼리하는 경우 항상 0입니다.

statement_sql_handle

varbinary(64)

적용 대상: SQL Server 2014부터 SQL Server 2014까지

나중에 사용하도록 예약되어 있습니다.

statement_context_id

bigint

적용 대상: SQL Server 2014부터 SQL Server 2014까지

나중에 사용하도록 예약되어 있습니다.

1 고유하게 컴파일된 저장 프로시저에 대해 통계 컬렉션을 설정하면 작업자 시간이 밀리초 단위로 수집됩니다. 쿼리가 밀리초 미만 단위로 실행되는 경우 값은 0이 됩니다.

사용 권한

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

설명

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

1. TOP N 쿼리 찾기

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

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

2. 쿼리에 대한 행 개수 집계 반환

다음 예에서는 쿼리에 대한 행 개수 집계 정보(합계 행, 최소 행, 최대 행 및 마지막 행)를 반환합니다.

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;

참고 항목

동적 관리 뷰 및 함수(Transact-SQL)
실행 관련 동적 관리 뷰 및 함수(Transact-SQL)
sys.dm_exec_sql_text(Transact-SQL)
sys.dm_exec_query_plan(Transact-SQL)