다음을 통해 공유


쿼리 프로파일링 인프라

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric의 SQL 데이터베이스

SQL Server 데이터베이스 엔진은 쿼리 실행 계획에 대한 런타임 정보에 대한 액세스를 제공합니다. 성능 문제가 발생할 경우, 가장 중요한 작업 중 하나는 실행 중인 워크로드와 리소스 사용량을 정확하게 파악하는 것입니다. 따라서 실제 실행 계획에 대한 액세스가 중요합니다.

쿼리 완성은 실제 쿼리 계획의 가용성을 위한 필수 구성 요소이지만, 활성 쿼리 통계는 한 쿼리 계획 연산자에서 다른 쿼리 계획 연산자로 데이터가 흐르기 때문에 쿼리 실행 프로세스에 대한 실시간 인사이트를 제공할 수 있습니다. 활성 쿼리 계획은 전체 쿼리 진행률 및 생성된 행 수, 경과 시간, 연산자 진행률 등과 같은 연산자 수준의 런타임 실행 통계를 표시합니다. 이 데이터는 쿼리가 완료될 때까지 기다릴 필요 없이 실시간으로 사용할 수 있으므로 이 실행 통계는 오래 실행되는 쿼리, 무한하게 실행되는 쿼리, 끝나지 않는 쿼리 등의 쿼리 성능 문제를 디버깅할 때 매우 유용합니다.

표준 쿼리 실행 통계 프로파일링 인프라

실행 계획, 즉 행 수, CPU 및 I/O 사용량에 대한 정보를 수집하려면 쿼리 실행 통계 프로필 인프라 또는 표준 프로파일링을 사용하도록 설정해야 합니다. 대상 세션에 대한 실행 계획 정보를 수집하는 다음 메서드는 표준 프로파일링 인프라를 사용합니다.

Note

SQL Server Management Studio에서 라이브 쿼리 통계 포함 단추를 선택하면 표준 프로파일링 인프라가 사용됩니다. 이후 버전의 SQL Server에서 경량 프로파일링 인프라 를 사용하는 경우 활동 모니터 를 통해 보거나 sys.dm_exec_query_profiles DMV를 직접 쿼리할 때 표준 프로파일링 대신 라이브 쿼리 통계에서 사용됩니다.

모든 세션에 대해 전역적으로 실행 계획 정보를 수집하는 다음 메서드는 표준 프로파일링 인프라를 사용합니다.

이벤트를 사용하는 query_post_execution_showplan 확장 이벤트 세션을 실행하는 경우 sys.dm_exec_query_profiles DMV도 채워져 활동 모니터 를 사용하거나 DMV를 직접 쿼리하여 모든 세션에 대한 라이브 쿼리 통계를 사용할 수 있습니다. 자세한 내용은 Live Query Statistics를 참조하세요.

간단한 쿼리 실행 통계 프로파일링 인프라

SQL Server 2014(12.x) SP2 및 SQL Server 2016(13.x)부터 새로운 경량 쿼리 실행 통계 프로파일링 인프라 또는 경량 프로파일링이 도입되었습니다.

Note

고유하게 컴파일된 저장 프로시저는 경량 프로파일링에서 지원되지 않습니다.

간단한 쿼리 실행 통계 프로파일링 인프라 v1

적용 대상: SQL Server 2014(12.x) SP2 ~ SQL Server 2016(13.x).

SQL Server 2014(12.x) SP2 및 SQL Server 2016(13.x)부터 경량 프로파일링이 도입되어 실행 계획에 대한 정보를 수집하는 성능 오버헤드가 감소했습니다. 표준 프로파일링과 달리 경량 프로파일링은 CPU 런타임 정보를 수집하지 않습니다. 그러나 경량 프로파일링은 여전히 행 수 및 I/O 사용 정보를 수집합니다.

경량 프로파일링을 사용하는 새로운 query_thread_profile 확장 이벤트도 도입되었습니다. 이 확장 이벤트는 각 노드 및 스레드의 성능에 대한 더 많은 인사이트를 허용하는 연산자별 실행 통계를 노출합니다. 이 확장 이벤트를 사용하는 샘플 세션은 다음 예제와 같이 구성할 수 있습니다.

CREATE EVENT SESSION [NodePerfStats] ON SERVER
ADD EVENT sqlserver.query_thread_profile
    (
    ACTION (sqlos.scheduler_id,
            sqlserver.database_id,
            sqlserver.is_system,
            sqlserver.plan_handle,
            sqlserver.query_hash_signed,
            sqlserver.query_plan_hash_signed,
            sqlserver.server_instance_name,
            sqlserver.session_id,
            sqlserver.session_nt_username,
            sqlserver.sql_text)
    )
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
        MAX_MEMORY = 4096 KB,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 30 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
);

Note

쿼리 프로파일링의 성능 오버헤드에 대한 자세한 내용은 개발자 선택: 쿼리 진행률 - 언제 어디서나 블로그 게시물을 참조하세요.

이벤트를 사용하는 query_thread_profile 확장 이벤트 세션을 실행하는 경우 sys.dm_exec_query_profiles DMV도 간단한 프로파일링을 사용하여 채워지며, 이를 통해 활동 모니터 를 사용하거나 DMV를 직접 쿼리하는 모든 세션에 대한 라이브 쿼리 통계를 사용할 수 있습니다.

간단한 쿼리 실행 통계 프로파일링 인프라 v2

적용 대상: SQL Server 2016 (13.x) SP1 ~ SQL Server 2017 (14.x).

SQL Server 2016(13.x) SP1에는 오버헤드를 최소화하도록 수정된 버전의 간단한 프로파일링이 포함되어 있습니다. 경량 프로파일링은 이전에 적용 대상에 명시된 버전에 대해 추적 플래그 7412를 사용하여 전역적으로 사용하도록 설정할 수도 있습니다. 새 DMF sys.dm_exec_query_statistics_xml은 진행 중인 요청에 대한 쿼리 실행 계획을 반환하기 위해 도입되었습니다.

SQL Server 2016(13.x) SP2 CU3 및 SQL Server 2017(14.x) CU11부터 경량 프로파일링을 전역적으로 사용하도록 설정하지 않은 경우 새 USE HINT 쿼리 힌트 인수 QUERY_PLAN_PROFILE 를 사용하여 모든 세션에 대해 쿼리 수준에서 간단한 프로파일링을 사용하도록 설정할 수 있습니다. 이 새 힌트를 포함하는 쿼리가 완료되면 확장 이벤트와 유사한 query_plan_profile 실제 실행 계획 XML을 제공하는 새 query_post_execution_showplan 확장 이벤트도 출력됩니다.

Note

query_plan_profile 또한 확장 이벤트는 쿼리 힌트를 사용하지 않더라도 경량 프로파일링을 사용합니다.

확장 이벤트를 사용하는 샘플 세션은 query_plan_profile 다음 예제와 같이 구성할 수 있습니다.

CREATE EVENT SESSION [PerfStats_LWP_Plan] ON SERVER
ADD EVENT sqlserver.query_plan_profile
    (
    ACTION (sqlos.scheduler_id,
            sqlserver.database_id,
            sqlserver.is_system,
            sqlserver.plan_handle,
            sqlserver.query_hash_signed,
            sqlserver.query_plan_hash_signed,
            sqlserver.server_instance_name,
            sqlserver.session_id,
            sqlserver.session_nt_username,
            sqlserver.sql_text)
    )
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
        MAX_MEMORY = 4096 KB,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 30 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
);

간단한 쿼리 실행 통계 프로파일링 인프라 v3

적용 대상: SQL Server 2019(15.x) 이상 버전 및 Azure SQL Database

SQL Server 2019(15.x) 및 Azure SQL 데이터베이스에는 모든 실행에 대한 행 개수 정보를 수집하는 경량 프로파일링의 새로 수정된 버전이 포함되어 있습니다. SQL Server 2019(15.x) 및 Azure SQL 데이터베이스에는 경량 프로파일링이 기본적으로 사용하도록 설정되어 있습니다. SQL Server 2019(15.x) 이상 버전에서는 추적 플래그 7412가 적용되지 않습니다. 데이터베이스 LIGHTWEIGHT_QUERY_PROFILING을 사용하여 ALTER DATABASE SCOPED CONFIGURATION SET LIGHTWEIGHT_QUERY_PROFILING = OFF; 데이터베이스 수준에서 경량 프로파일링을 사용하지 않도록 설정할 수 있습니다.

대부분의 쿼리에 대해 마지막으로 알려진 실제 실행 계획, 즉 마지막 쿼리 계획 통계와 동일한 계획을 반환하는 새 DMF sys.dm_exec_query_plan_stats가 도입되었습니다. 마지막 쿼리 계획 통계는 데이터베이스 LAST_QUERY_PLAN_STATS을 사용하여 ALTER DATABASE SCOPED CONFIGURATION SET LAST_QUERY_PLAN_STATS = ON; 데이터베이스 수준에서 사용하도록 설정할 수 있습니다.

query_post_execution_plan_profile 확장 이벤트는 표준 프로파일링을 사용하는 것과 달리 query_post_execution_showplan경량 프로파일링을 기반으로 실제 실행 계획과 동등한 값을 수집합니다. SQL Server 2017(14.x)도 CU14부터 이 이벤트를 제공합니다. 확장 이벤트를 사용하는 샘플 세션은 query_post_execution_plan_profile 다음 예제와 같이 구성할 수 있습니다.

CREATE EVENT SESSION [PerfStats_LWP_All_Plans] ON SERVER
ADD EVENT sqlserver.query_post_execution_plan_profile
    (
    ACTION (sqlos.scheduler_id,
            sqlserver.database_id,
            sqlserver.is_system,
            sqlserver.plan_handle,
            sqlserver.query_hash_signed,
            sqlserver.query_plan_hash_signed,
            sqlserver.server_instance_name,
            sqlserver.session_id,
            sqlserver.session_nt_username,
            sqlserver.sql_text)
    )
ADD TARGET package0.ring_buffer (SET max_memory = (25600))
WITH
(
        MAX_MEMORY = 4096 KB,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 30 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
);

예제 1 - 표준 프로파일링을 사용하는 확장 이벤트 세션

CREATE EVENT SESSION [QueryPlanOld] ON SERVER
ADD EVENT sqlserver.query_post_execution_showplan
    (
    ACTION (sqlos.task_time,
            sqlserver.database_id,
            sqlserver.database_name,
            sqlserver.query_hash_signed,
            sqlserver.query_plan_hash_signed,
            sqlserver.sql_text)
    )
ADD TARGET package0.event_file
    (
    SET filename = N'C:\Temp\QueryPlanStd.xel'
    )
WITH
(
        MAX_MEMORY = 4096 KB,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 30 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
);

예제 2 - 경량 프로파일링을 사용하는 확장 이벤트 세션

CREATE EVENT SESSION [QueryPlanLWP] ON SERVER
ADD EVENT sqlserver.query_post_execution_plan_profile
    (
    ACTION (sqlos.task_time,
            sqlserver.database_id,
            sqlserver.database_name,
            sqlserver.query_hash_signed,
            sqlserver.query_plan_hash_signed,
            sqlserver.sql_text)
    )
ADD TARGET package0.event_file
    (
    SET filename = N'C:\Temp\QueryPlanLWP.xel'
    )
WITH
(
        MAX_MEMORY = 4096 KB,
        EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
        MAX_DISPATCH_LATENCY = 30 SECONDS,
        MAX_EVENT_SIZE = 0 KB,
        MEMORY_PARTITION_MODE = NONE,
        TRACK_CAUSALITY = OFF,
        STARTUP_STATE = OFF
);

쿼리 프로파일링 인프라 사용량 참고 자료

다음 표에는 전역적으로(서버 수준) 또는 단일 세션에서 표준 프로파일링 또는 경량 프로파일링을 사용하도록 설정하는 작업이 요약되어 있습니다. 또한 해당 작업을 사용할 수 있는 가장 초기 버전이 포함되어 있습니다.

Scope 표준 프로파일링 경량 프로파일링
Global XE를 사용한 확장 이벤트 query_post_execution_showplan 세션; SQL Server 2012(11.x)부터 트레이스 플래그 7412, SQL Server 2016(13.x) SP1부터
Global 추적 이벤트가 있는 Showplan XML SQL 추적 및 SQL Server 프로파일러 XE를 사용한 확장 이벤트 query_thread_profile 세션; SQL Server 2014(12.x) SP2부터
Global N/A XE를 사용한 확장 이벤트 query_post_execution_plan_profile 세션; SQL Server 2017(14.x) CU14 및 SQL Server 2019(15.x)부터
Session SET STATISTICS XML ON 사용 XE와 QUERY_PLAN_PROFILE 함께 확장 이벤트 세션과 함께 쿼리 힌트를 query_plan_profile 사용합니다. SQL Server 2016(13.x) SP2 CU3 및 SQL Server 2017(14.x) CU11부터
Session SET STATISTICS PROFILE ON 사용 N/A
Session SSMS에서 라이브 쿼리 통계 단추를 선택합니다. SQL Server 2014(12.x) SP2부터 N/A

Remarks

Important

sys.dm_exec_query_statistics_xml 참조하는 모니터링 저장 프로시저를 실행하는 동안 임의 액세스 위반이 발생할 수 있으므로 KB 4078596이 SQL Server 2016(13.x) 및 SQL Server 2017(14.x)에 설치되어 있는지 확인합니다.

경량 프로파일링 v2 및 낮은 오버헤드부터 CPU 바인딩되지 않은 모든 서버는 경량 프로파일링을 지속적으로 실행할 수 있으며 데이터베이스 전문가가 활동 모니터를 사용하거나 직접 쿼리하는 sys.dm_exec_query_profiles등 언제든지 실행 중인 실행을 활용할 수 있으며 런타임 통계를 사용하여 쿼리 계획을 가져올 수 있습니다.

쿼리 프로파일링의 성능 오버헤드에 대한 자세한 내용은 개발자 선택: 쿼리 진행률 - 언제 어디서나 블로그 게시물을 참조하세요.

경량 프로파일링을 사용하는 확장 이벤트는 표준 프로파일링 인프라가 이미 사용하도록 설정된 경우 표준 프로파일링의 정보를 사용합니다. 예를 들어 query_post_execution_showplan을 사용 중인 확장 이벤트 세션이 실행 중이고, query_post_execution_plan_profile을 사용 중인 다른 세션이 시작됩니다. 두 번째 세션은 여전히 표준 프로파일링의 정보를 사용합니다.

Note

SQL Server 2017(14.x)에서는 경량 프로파일링이 기본적으로 꺼져 있지만 확장 이벤트 추적이 query_post_execution_plan_profile 시작될 때 활성화된 다음 추적이 중지되면 다시 비활성화됩니다. 따라서 SQL Server 2017(14.x) 인스턴스에서 query_post_execution_plan_profile 확장 이벤트 추적을 자주 시작하고 중지하는 경우 반복되는 활성화/비활성화 오버헤드를 방지하려면 추적 플래그 7412를 사용하여 전역 수준에서 경량 프로파일링을 활성화해야 합니다.