다음을 통해 공유


sys.dm_exec_query_stats(Transact-SQL)

적용 대상: SQL ServerAzure SQL Database Azure 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)