다음을 통해 공유


sys.dm_exec_query_stats(Transact-SQL)

적용 대상:SQL ServerAzure SQL 데이터베이스Azure SQL Managed Instance

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

sys.dm_exec_query_stats 결과는 데이터가 완료된 쿼리만 반영하고 아직 진행 중인 쿼리는 반영하지 않으므로 실행마다 다를 수 있습니다.

Azure Synapse Analytics 또는 PDW(Analytics Platform System)의 전용 SQL 풀에서 이 DMV를 호출하려면 이름 sys.dm_pdw_nodes_exec_query_stats사용합니다. 서버리스 SQL 풀의 경우 sys.dm_exec_query_stats사용합니다.

열 이름 데이터 형식 설명
sql_handle varbinary(64) 쿼리가 포함된 일괄 처리 또는 저장 프로시저를 고유하게 식별하는 토큰입니다.

sql_handle statement_start_offsetstatement_end_offset함께 sys.dm_exec_sql_text 동적 관리 함수를 호출하여 쿼리의 SQL 텍스트를 검색하는 데 사용할 수 있습니다.
statement_start_offset int 0부터 시작하여 일괄 처리 또는 지속형 개체의 텍스트 내에서 행이 설명하는 쿼리의 시작 위치(바이트)를 나타냅니다.
statement_end_offset int 행이 일괄 처리 또는 지속형 개체의 텍스트 내에서 설명하는 쿼리의 끝 위치를 0부터 바이트 단위로 나타냅니다. SQL Server 2014(12.x) 이전 버전의 경우 -1 값은 일괄 처리의 끝을 나타냅니다. 후행 주석을 더이상 포함하지 않습니다.
plan_generation_num bigint 다시 컴파일한 후 계획의 인스턴스를 구분하는 데 사용할 수 있는 시퀀스 번호입니다.
plan_handle varbinary(64) 실행되고 해당 계획이 계획 캐시에 있거나 현재 실행 중인 일괄 처리에 대한 쿼리 실행 계획을 고유하게 식별하는 토큰입니다. 이 값을 sys.dm_exec_query_plan 동적 관리 함수에 전달하여 쿼리 계획을 가져올 수 있습니다.

고유하게 컴파일된 저장 프로시저가 메모리 최적화 테이블을 쿼리할 때 항상 0x000.
creation_time 날짜/시간 이 계획이 컴파일된 시간입니다. 시간은 현재 표준 시간대기록됩니다.
last_execution_time 날짜/시간 계획이 실행되기 시작한 마지막 시간입니다. 시간은 현재 표준 시간대기록됩니다.
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(12.x) 이상 버전

쿼리 저장소 켜져 있고 해당 특정 쿼리에 대한 통계를 수집하는 경우에만 NULL이 아닌 값으로 채워집니다.
statement_context_id bigint 적용 대상: SQL Server 2014(12.x) 이상 버전

쿼리 저장소 켜져 있고 해당 특정 쿼리에 대한 통계를 수집하는 경우에만 NULL이 아닌 값으로 채워집니다.
total_dop bigint 이 계획이 컴파일된 이후 사용한 병렬 처리 정도의 총 합계입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
last_dop bigint 이 계획이 마지막으로 실행된 경우의 병렬 처리 수준입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
min_dop bigint 이 계획이 한 번의 실행 중에 사용한 최소 병렬 처리 수준입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
max_dop bigint 이 계획이 한 번의 실행 중에 사용한 최대 병렬 처리 수준입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
total_grant_kb bigint 이 계획이 컴파일된 이후 받은 KB의 예약된 메모리 부여의 총 양입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
last_grant_kb bigint 이 계획이 마지막으로 실행되었을 때 예약된 메모리 부여의 양(KB)입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
min_grant_kb bigint 이 계획이 한 번의 실행 중에 받은 최소 예약 메모리 부여 양(KB)입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
max_grant_kb bigint 이 계획이 한 번의 실행 중에 받은 최대 예약 메모리 부여 양(KB)입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
total_used_grant_kb bigint 이 계획이 컴파일된 이후 사용된 KB의 예약된 메모리 부여의 총 양입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
last_used_grant_kb bigint 이 계획이 마지막으로 실행되었을 때 사용된 메모리 부여의 양(KB)입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
min_used_grant_kb bigint 이 계획이 한 번의 실행 중에 사용한 최소 사용량(KB)입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
max_used_grant_kb bigint 이 계획이 한 번의 실행 중에 사용한 최대 사용된 메모리 부여 양(KB)입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
total_ideal_grant_kb bigint 이 계획이 컴파일된 이후 예상된 KB의 이상적인 메모리 부여 총량입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
last_ideal_grant_kb bigint 이 계획이 마지막으로 실행되었을 때 KB의 이상적인 메모리 부여 양입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
min_ideal_grant_kb bigint 한 번의 실행 중에 이 계획이 예상한 KB의 최소 이상적인 메모리 부여 양입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
max_ideal_grant_kb bigint 한 번의 실행 중에 이 계획이 예상한 KB의 이상적인 메모리 부여의 최대 크기입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
total_reserved_threads bigint 이 계획이 컴파일된 이후 사용한 예약된 병렬 스레드의 총 합계입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
last_reserved_threads bigint 이 계획이 마지막으로 실행된 경우 예약된 병렬 스레드의 수입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
min_reserved_threads bigint 이 계획이 한 번의 실행 중에 사용한 최소 예약 병렬 스레드 수입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
max_reserved_threads bigint 이 계획이 한 번의 실행 중에 사용한 예약된 병렬 스레드의 최대 수입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
total_used_threads bigint 이 계획이 컴파일된 이후 사용한 사용된 병렬 스레드의 총 합계입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
last_used_threads bigint 이 계획이 마지막으로 실행되었을 때 사용된 병렬 스레드의 수입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
min_used_threads bigint 이 계획이 한 번의 실행 중에 사용한 최소 병렬 스레드 수입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
max_used_threads bigint 이 계획이 한 번의 실행 중에 사용한 최대 병렬 스레드 수입니다. 항상 메모리 최적화 테이블을 쿼리하는 0.

적용 대상: SQL Server 2016(13.x) 이상 버전
total_columnstore_segment_reads bigint 쿼리에서 읽은 columnstore 세그먼트의 총 합계입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
last_columnstore_segment_reads bigint 쿼리의 마지막 실행에서 읽은 columnstore 세그먼트의 수입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
min_columnstore_segment_reads bigint 한 번의 실행 중에 쿼리에서 읽은 최소 columnstore 세그먼트 수입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
max_columnstore_segment_reads bigint 한 번의 실행 중에 쿼리에서 읽은 최대 columnstore 세그먼트 수입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
total_columnstore_segment_skips bigint 쿼리에서 건너뛴 columnstore 세그먼트의 총 합계입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
last_columnstore_segment_skips bigint 쿼리의 마지막 실행에서 건너뛴 columnstore 세그먼트의 수입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
min_columnstore_segment_skips bigint 한 번의 실행 중에 쿼리에서 건너뛴 최소 columnstore 세그먼트 수입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
max_columnstore_segment_skips bigint 한 번의 실행 중에 쿼리에서 건너뛴 최대 columnstore 세그먼트 수입니다. null일 수 없습니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
total_spills bigint 컴파일된 이후 이 쿼리를 실행하여 유출된 총 페이지 수입니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
last_spills bigint 쿼리가 마지막으로 실행되었을 때 유출된 페이지 수입니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
min_spills bigint 단일 실행 중에 이 쿼리가 유출된 최소 페이지 수입니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
max_spills bigint 단일 실행 중에 이 쿼리가 유출된 최대 페이지 수입니다.

적용 대상: SQL Server 2016(13.x) SP2 및 SQL Server 2017(14.x) CU3부터
pdw_node_id int 이 배포가 있는 노드의 식별자입니다.

적용 대상: Azure Synapse Analytics, Analytics Platform System(PDW)
total_page_server_reads bigint 이 계획이 컴파일된 이후 이 계획의 실행에 의해 수행된 총 원격 페이지 서버 읽기 수입니다.

적용 대상: Azure SQL Database 하이퍼스케일
last_page_server_reads bigint 계획이 마지막으로 실행되었을 때 수행된 원격 페이지 서버 읽기 수입니다.

적용 대상: Azure SQL Database 하이퍼스케일
min_page_server_reads bigint 단일 실행 중에 이 계획이 수행한 최소 원격 페이지 서버 읽기 수입니다.

적용 대상: Azure SQL Database 하이퍼스케일
max_page_server_reads bigint 단일 실행 중에 이 계획이 수행한 최대 원격 페이지 서버 읽기 수입니다.

적용 대상: Azure SQL Database 하이퍼스케일

참고 항목

1 통계 수집을 사용하는 경우 고유하게 컴파일된 저장 프로시저의 경우 작업자 시간이 밀리초 단위로 수집됩니다. 쿼리가 1밀리초 이내에 실행되면 값이 0.

사용 권한

SQL Server 2019(15.x) 및 이전 버전 및 Azure SQL Managed Instance에는 VIEW SERVER STATE 권한이 필요합니다.

SQL Server 2022(16.x) 이상 버전에는 서버에 대한 VIEW SERVER PERFORMANCE STATE 권한이 필요합니다.

Azure SQL Database 기본, S0S1 서비스 목표 및 탄력적 풀데이터베이스의 경우 서버 관리자 계정, Microsoft Entra 관리자 계정 또는 ##MS_ServerStateReader##서버 역할 멤버 자격이 필요합니다. 다른 모든 SQL Database 서비스 목표에 대해서는 데이터베이스에 대한 VIEW DATABASE STATE 권한 또는 ##MS_ServerStateReader## 서버 역할의 멤버 자격이 필요합니다.

설명

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

예제

A. TOP N 쿼리 찾기

다음 예제는 평균 CPU 시간을 기준으로 상위 5개 쿼리에 대한 정보를 반환합니다. 이 예제에서는 쿼리 해시에 따라 쿼리를 집계하여 논리적으로 동등한 쿼리를 누적 리소스 사용량별로 그룹화합니다. Sample_Statement_Text 열은 쿼리 해시와 일치하는 쿼리 구조의 예를 보여 주지만 문의 특정 값과 관계없이 읽어야 합니다. 예를 들어 문에 WHERE Id = 5포함된 경우 보다 일반적인 형식인 WHERE Id = @some_value읽을 수 있습니다.

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 Sample_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;

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;