sys.dm_exec_query_profiles(Transact-SQL)
적용 대상: SQL Server Azure SQL 데이터베이스 Azure 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;