sys.dm_exec_query_stats(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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

참고 항목

  • sys.dm_exec_query_stats 결과는 데이터가 완료된 쿼리만 반영하고 아직 진행 중인 쿼리는 반영하지 않으므로 실행마다 다를 수 있습니다.
  • Azure Synapse Analytics 또는 PDW(Analytics Platform System)의 전용 SQL 풀에서 이를 호출하려면 이름 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 및 SQL Managed Instance에서는 VIEW SERVER STATE 권한이 필요합니다.

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

SQL Server 2022 이상에 대한 권한

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

설명

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

예제

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;  

참고 항목

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