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_offset 및 statement_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 기본, S0및 S1 서비스 목표 및 탄력적 풀데이터베이스의 경우 서버 관리자 계정, 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;