sys.dm_exec_query_profiles(Transact-SQL)

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

쿼리가 실행되는 동안 실시간 쿼리 프로세스를 모니터링합니다. 예를 들어 이 DMV를 사용하여 쿼리의 어느 부분이 느리게 실행되고 있는지 확인합니다. 설명 필드에서 식별된 열을 사용하여 이 DMV를 다른 시스템 DMV와 조인합니다. 또는 타임스탬프 열을 사용하여 이 DMV를 다른 성능 카운터(예: 성능 모니터, xperf)와 조인합니다.

반환된 테이블

반환되는 카운터는 스레드당 연산자당입니다. 결과는 동적이며 쿼리가 완료된 경우에만 출력을 만드는 것과 같은 SET STATISTICS XML ON 기존 옵션의 결과와 일치하지 않습니다.

열 이름 데이터 형식 설명
session_id smallint 이 쿼리가 실행되는 세션을 식별합니다. dm_exec_sessions.session_id를 참조합니다.
request_id int 대상 요청을 식별합니다. dm_exec_sessions.request_id를 참조합니다.
sql_handle varbinary(64) 쿼리가 속하는 일괄 처리 또는 저장 프로시저를 고유하게 식별하는 토큰입니다. dm_exec_query_stats.sql_handle을 참조합니다.
plan_handle varbinary(64) 실행된 일괄 처리에 대한 쿼리 실행 계획을 고유하게 식별하며 관련 계획이 계획 캐시에 있거나 현재 실행 중인 토큰입니다. dm_exec_query_stats.plan_handle을 참조합니다.
physical_operator_name nvarchar(256) 물리 연산자 이름입니다.
node_id int 쿼리 트리에서 연산자 노드를 식별합니다.
thread_id int 동일한 쿼리 연산자 노드에 속하는 스레드(병렬 쿼리의 경우)를 구분합니다.
task_address varbinary(8) 이 스레드에서 사용 중인 SQLOS 작업을 식별합니다. dm_os_tasks.task_address를 참조합니다.
row_count bigint 지금까지 연산자가 반환한 행 수입니다.
rewind_count bigint 지금까지의 되감기 횟수입니다.
rebind_count bigint 지금까지의 리바인드 수입니다.
end_of_scan_count bigint 지금까지의 검사 종료 횟수입니다.
estimate_row_count bigint 예상 행 수입니다. 실제 row_count estimated_row_count 비교하는 것이 유용할 수 있습니다.
first_active_time bigint 연산자가 처음 호출된 시간(밀리초)입니다.
last_active_time bigint 연산자가 마지막으로 호출된 시간(밀리초)입니다.
open_time bigint 열린 때의 타임스탬프입니다(밀리초).
first_row_time bigint 첫 번째 행이 열린 타임스탬프입니다(밀리초).
last_row_time bigint 마지막 행이 열린 타임스탬프(밀리초)입니다.
close_time bigint 닫을 때의 타임스탬프(밀리초)입니다.
elapsed_time_ms bigint 지금까지 대상 노드의 작업에서 사용한 총 경과 시간(밀리초)입니다.
cpu_time_ms bigint 지금까지 대상 노드의 작업에서 사용한 총 CPU 시간(밀리초)입니다.
database_id smallint 읽기 및 쓰기를 수행하는 개체가 포함된 데이터베이스의 ID입니다.
object_id int 읽기 및 쓰기가 수행되는 개체의 식별자입니다. 참조 sys.objects.object_id.
index_id int 행 집합이 열려 있는 인덱스(있는 경우)입니다.
scan_count bigint 지금까지의 테이블/인덱스 검사 수입니다.
logical_read_count bigint 지금까지의 논리적 읽기 수입니다.
physical_read_count bigint 지금까지 실제 읽기 수입니다.
read_ahead_count bigint 지금까지의 미리 읽기 수입니다.
write_page_count bigint 유출로 인한 지금까지의 페이지 쓰기 수입니다.
lob_logical_read_count bigint 지금까지 LOB 논리 읽기 수입니다.
lob_physical_read_count bigint 지금까지 LOB 물리적 읽기 수입니다.
lob_read_ahead_count bigint 지금까지 LOB 미리 읽기 수입니다.
segment_read_count int 지금까지의 세그먼트 read-ahead 수입니다.
segment_skip_count int 지금까지 생략된 세그먼트 수입니다.
actual_read_row_count bigint 잔차 조건자가 적용되기 전에 연산자가 읽은 행 수입니다.
estimated_read_row_count bigint 적용 대상: SQL Server 2016(13.x) SP1부터 시작합니다.
잔차 조건자가 적용되기 전에 연산자가 읽을 것으로 예상되는 행 수입니다.

일반적인 주의 사항

쿼리 계획 노드에 I/O가 없으면 모든 I/O 관련 카운터가 NULL로 설정됩니다.

이 DMV에서 보고한 I/O 관련 카운터는 다음 두 가지 방법으로 보고된 SET STATISTICS IO 카운터보다 더 세분화되어 있습니다.

  • SET STATISTICS IO 는 모든 I/O에 대한 카운터를 지정된 테이블에 함께 그룹화합니다. 이 DMV를 사용하면 테이블에 대한 I/O를 수행하는 쿼리 계획의 모든 노드에 대해 별도의 카운터를 가져옵니다.

  • 병렬 검색이 있는 경우 이 DMV는 검사에서 작업하는 각 병렬 스레드에 대한 카운터를 보고합니다.

SQL Server 2016(13.x) SP1부터 표준 쿼리 실행 통계 프로파일링 인프라는 간단한 쿼리 실행 통계 프로파일링 인프라나란히 존재합니다. SET STATISTICS XML ON항상 SET STATISTICS PROFILE ON 표준 쿼리 실행 통계 프로파일링 인프라를 사용합니다. sys.dm_exec_query_profiles 채워지려면 쿼리 프로파일링 인프라 중 하나를 사용하도록 설정해야 합니다. 자세한 내용은 쿼리 프로파일링 인프라를 참조 하세요.

참고 항목

조사 중인 쿼리는 쿼리 프로파일링 인프라를 사용하도록 설정한 후에 시작해야 하며, 쿼리가 시작된 후에 사용하도록 설정하면 결과가 sys.dm_exec_query_profiles생성되지 않습니다. 쿼리 프로파일링 인프라를 사용하도록 설정하는 방법에 대한 자세한 내용은 쿼리 프로파일링 인프라를 참조 하세요.

사용 권한

  • SQL Server 및 Azure SQL Managed Instance에서 데이터베이스 역할의 db_owner 권한 및 멤버 자격이 필요합니다VIEW DATABASE STATE.
  • Azure SQL Database 프리미엄 계층에서 데이터베이스에 대한 VIEW DATABASE STATE 권한이 필요합니다.
  • Azure SQL Database Basic, S0 및 S1 서비스 목표 및 탄력적 풀 의 데이터베이스에는 서버 관리자 계정 또는 Microsoft Entra 관리자 계정이 필요합니다. 다른 모든 SQL Database 서비스 목표에서는 데이터베이스에 VIEW DATABASE STATE 권한이 필요합니다.

SQL Server 2022 이상에 대한 권한

데이터베이스에 대한 VIEW DATABASE PERFORMANCE STATE 권한이 필요합니다.

예제

1단계: 분석할 쿼리를 실행하려는 세션에 로그인합니다 sys.dm_exec_query_profiles. 프로파일링에 대한 쿼리를 SET STATISTICS PROFILE ON구성하려면 . 이 동일한 세션에서 쿼리를 실행합니다.

--Configure query for profiling with sys.dm_exec_query_profiles  
SET STATISTICS PROFILE ON;  
GO  

--Or enable query profiling globally under SQL Server 2016 SP1 or above (not needed in SQL Server 2019)  
DBCC TRACEON (7412, -1);  
GO 
  
--Next, run your query in this session, or in any other session if query profiling has been enabled globally 

2단계: 쿼리가 실행되는 세션과 다른 두 번째 세션에 로그인합니다.

다음 문은 세션 54에서 현재 실행 중인 쿼리의 진행률을 요약합니다. 이렇게 하려면 각 노드의 모든 스레드에서 출력 행의 총 수를 계산하고 해당 노드의 예상 출력 행 수와 비교합니다.

--Run this in a different session than the session in which your query is running. 
--Note that you may need to change session id 54 below with the session id you want to monitor.
SELECT node_id,physical_operator_name, SUM(row_count) row_count, 
  SUM(estimate_row_count) AS estimate_row_count, 
  CAST(SUM(row_count)*100 AS float)/SUM(estimate_row_count)  
FROM sys.dm_exec_query_profiles   
WHERE session_id=54
GROUP BY node_id,physical_operator_name  
ORDER BY node_id;  

참고 항목

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