Поделиться через


Инфраструктура профилирования запросов

Применимо к:SQL ServerAzure SQL База данныхAzure SQL Управляемый экземплярSQL База данных в Microsoft Fabric

Ядро СУБД SQL Server предоставляет доступ к сведениям о среде выполнения по планам выполнения запросов. При возникновении проблемы с производительностью одним из самых важных действий является получение сведений о том, какая рабочая нагрузка выполняется в данный момент и каким образом происходит управление ресурсами. Таким образом, важно получить доступ к фактическому плану выполнения .

Несмотря на то, что для доступности действительного плана запроса необходимо дождаться завершения выполнения запроса, динамическая статистика запросов может анализировать процесс выполнения запроса в режиме реального времени, по мере передачи управления от одного оператора плана запроса другому. План динамического запроса отображает общую статистику выполнения запроса и статистику выполнения на уровне оператора, например количество созданных строк, время ожидания, ход выполнения оператора и т. д. Так как эти данные доступны в режиме реального времени без необходимости ожидать завершения запроса, эти статистические данные выполнения чрезвычайно полезны для отладки проблем с производительностью запросов, таких как длительные запросы, и запросы, которые выполняются бесконечно и никогда не завершаются.

Стандартная инфраструктура профилирования статистики выполнения запросов

Инфраструктуру профиля выполнения запросов или стандартную профилирование необходимо включить для сбора сведений о планах выполнения, а именно количестве строк, использовании ЦП и операций ввода-вывода. Следующие методы сбора сведений о плане выполнения для целевого сеанса используют стандартную инфраструктуру профилирования:

Примечание.

При выборе кнопки Включить статистику динамических запросов в SQL Server Management Studio используется стандартная инфраструктура профилирования. В более поздних версиях SQL Server, если включена упрощенная инфраструктура профилирования , она используется статистикой динамических запросов вместо стандартного профилирования при просмотре с помощью монитора действий или непосредственного запроса sys.dm_exec_query_profiles dmV .

Следующие методы сбора сведений о плане выполнения глобально для всех сеансов используют стандартную инфраструктуру профилирования:

При выполнении расширенного сеанса событий, использующего query_post_execution_showplan событие, sys.dm_exec_query_profiles dmV также заполняется, что обеспечивает статистику динамических запросов для всех сеансов, используя монитор действий или напрямую запрашивая динамическое динамическое представление. Дополнительные сведения см. в статье Live Query Statistics.

Инфраструктура профилирования статистики выполнения упрощенного запроса

Начиная с SQL Server 2014 (12.x) SP2 и SQL Server 2016 (13.x), была представлена новая облегченная инфраструктура профилирования статистики выполнения запросов, или упрощенное профилирование.

Примечание.

Скомпилированные хранимые процедуры в собственном коде не поддерживаются с упрощенной профилированием.

Упрощенная инфраструктура профилирования статистики выполнения запросов версии 1

Область применения: SQL Server 2014 (12.x) с пакетом обновления 2 (SP2) до SQL Server 2016 (13.x).

Начиная с SQL Server 2014 (12.x) с пакетом обновления 2 (SP2) и SQL Server 2016 (13.x), затраты на производительность для сбора сведений о планах выполнения были сокращены с введением упрощенного профилирования. В отличие от стандартного профилирования, упрощенное профилирование не собирает сведения о среде выполнения ЦП. Однако упрощенное профилирование по-прежнему собирает сведения о количестве строк и сведения об использовании операций ввода-вывода.

Также было введено новое 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
);

Примечание.

Дополнительные сведения о снижении потребления ресурсов профилированием запросов см. в записи блога Developers Choice: Query progress - anytime, anywhere (Выбор разработчика: ход выполнения запроса — всегда и везде).

При выполнении расширенного сеанса событий, использующего query_thread_profile событие, sys.dm_exec_query_profiles dmV также заполняется с помощью упрощенного профилирования, что обеспечивает статистику динамических запросов для всех сеансов, используя монитор действий или напрямую запрашивая динамическое динамическое представление.

Упрощенная инфраструктура профилирования статистики выполнения запросов версии 2

Область применения: SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) до SQL Server 2017 (14.x).

SQL Server 2016 (13.x) с пакетом обновления 1 (SP1) включает обновленную версию упрощенного профилирования с минимальными затратами. Упрощенное профилирование также можно включить глобально с помощью флага трассировки 7412 для версий, указанных ранее в разделе "Применимо". Представлена новая функция динамического управления данными sys.dm_exec_query_statistics_xml для предоставления плана выполнения запроса для запросов, находящихся в обработке.

Начиная с SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и SQL Server 2017 (14.x) CU11, если упрощенное профилирование не включено глобально, новый аргумент QUERY_PLAN_PROFILE можно использовать для включения упрощенного профилирования на уровне запроса для любого сеанса. Когда запрос, содержащий это новое указание, завершается, новое query_plan_profile расширенное событие также выводится, предоставляющее фактический XML-код плана выполнения, аналогичный расширенному query_post_execution_showplan событию.

Примечание.

Расширенное 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
);

Упрощенная инфраструктура профилирования статистики выполнения запросов версии 3

Область применения: SQL Server 2019 (15.x) и более поздних версий и База данных SQL Azure

SQL Server 2019 (15.x) и База данных SQL Azure включают в себя только что измененную версию упрощенного профилирования, собирающую сведения о количестве строк для всех выполнений. Включение упрощенного профилирования производится по умолчанию в SQL Server 2019 (15.x) и Azure SQL Database. В SQL Server 2019 (15.x) и более поздних версиях флаг трассировки 7412 не действует. Упрощенное профилирование можно отключить на уровне базы данных с помощью LIGHTWEIGHT_QUERY_PROFILINGконфигурацииALTER DATABASE SCOPED CONFIGURATION SET LIGHTWEIGHT_QUERY_PROFILING = OFF; базы данных:

Появилась новая функция динамического управления 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
);

Руководство по использованию инфраструктуры профилирования запросов

В приведенной ниже таблице перечислены действия по включению стандартного или упрощенного профилирования глобально (на уровне сервера) или в одном сеансе. Также включена информация о первой версии, в которой доступно это действие.

Область Стандартное профилирование Легковесное профилирование
Глобальный Расширенный query_post_execution_showplan сеанс событий с XE; Начиная с SQL Server 2012 (11.x) Флаг трассировки 7412; Начиная с SQL Server 2016 (13.x) SP1
Глобальный Трассировка SQL и профилировщик SQL Server с событием Showplan XML трассировки Расширенный query_thread_profile сеанс событий с XE; Начиная с SQL Server 2014 (12.x) с пакетом обновления 2 (SP2)
Глобальный N/A Расширенный query_post_execution_plan_profile сеанс событий с XE; Начиная с SQL Server 2017 (14.x) CU14 и SQL Server 2019 (15.x)
Сеанс Используйте SET STATISTICS XML ON QUERY_PLAN_PROFILE Используйте указание запроса вместе с сеансом расширенного события с query_plan_profile XE; Начиная с SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и SQL Server 2017 (14.x) CU11
Сеанс Используйте SET STATISTICS PROFILE ON N/A
Сеанс Нажмите кнопку "Статистика динамических запросов " в SSMS; Начиная с SQL Server 2014 (12.x) с пакетом обновления 2 (SP2) N/A

Замечания

Внимание

Из-за возможного нарушения доступа к памяти при выполнении хранимой процедуры мониторинга, которая ссылается на sys.dm_exec_query_statistics_xml, убедитесь, что обновление KB 4078596 установлено в SQL Server 2016 (13.x) и SQL Server 2017 (14.x).

Начиная с упрощенного профилирования версии 2 и его низкой нагрузки, любой сервер, который еще не привязан к ЦП, может непрерывно выполнять упрощенное профилирование и разрешать специалистам по базам данных в любое время выполнять любое выполнение, например с помощью монитора активности или непосредственного запроса sys.dm_exec_query_profiles, и получить план запроса со статистикой среды выполнения.

Дополнительные сведения о снижении потребления ресурсов профилированием запросов см. в записи блога Developers Choice: Query progress - anytime, anywhere (Выбор разработчика: ход выполнения запроса — всегда и везде).

Расширенные события, использующие упрощенное профилирование, используют сведения о стандартном профилировании, если инфраструктура профилирования уже включена. Допустим, запущен сеанс расширенных событий query_post_execution_showplan, и запускается еще один сеанс событий query_post_execution_plan_profile. Второй сеанс по-прежнему использует сведения из стандартного профилирования.

Примечание.

В SQL Server 2017 (14.x) упрощенное профилирование отключено по умолчанию, но активируется при запуске трассировки расширенных событий, на которую используется использование query_post_execution_plan_profile , а затем деактивируется снова при остановке трассировки. В результате, если трассировки расширенных событий на основе query_post_execution_plan_profile часто запускаются и остановлены на экземпляре SQL Server 2017 (14.x), следует активировать упрощенное профилирование на глобальном уровне с флагом трассировки 7412, чтобы избежать повторяющихся затрат на активацию и деактивацию.