Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
База данных SQL в Microsoft Fabric
Возвращает инструкцию Showplan в текстовом формате для пакета Transact-SQL или для определенной инструкции в пакете. План запроса, указанный дескриптором плана, можно кэшировать или выполнять в данный момент. Эта функция с табличным значением похожа на функцию sys.dm_exec_query_plan (Transact-SQL), но имеет следующие отличия:
- Вывод плана запроса возвращается в текстовом формате.
- Размер вывода плана запроса не ограничен.
- Можно указать отдельные инструкции в пакете.
Область применения: SQL Server (SQL Server 2008 (10.0.x) и более поздних версий), База данных SQL Azure.
Соглашения о синтаксисе Transact-SQL
Syntax
sys.dm_exec_text_query_plan
(
plan_handle
, { statement_start_offset | 0 | DEFAULT }
, { statement_end_offset | -1 | DEFAULT }
)
Аргументы
plan_handle
Это токен, который уникально идентифицирует план выполнения запросов для выполненного пакета, план которого хранится в кэше планов или пребывает на этапе выполнения.
plan_handle — varbinary(64).
plan_handle можно получить из следующих объектов динамического управления:
statement_start_offset | 0 | DEFAULT
Начальная позиция запроса, который описывает строка, в соответствующем тексте пакета или сохраняемом объекте, в байтах.
statement_start_offset — int. Значение 0 обозначает начало пакета. Значение по умолчанию — 0.
Начальное смещение инструкции можно получить из следующих объектов DMO:
statement_end_offset | -1 | DEFAULT
Конечная позиция запроса, который описывает строка, в соответствующем тексте пакета или сохраняемом объекте, в байтах.
statement_start_offset — int.
Значение -1 обозначает конец пакета. По умолчанию используется значение 1.
Возвращаемая таблица
| Название столбца | Тип данных | Описание |
|---|---|---|
| dbid | smallint | Идентификатор базы данных, в контексте которой выполнялась компиляция инструкции Transact-SQL, соответствующей данному плану. Для нерегламентированных и подготовленных инструкций SQL это идентификатор базы данных, в которой происходила компиляция инструкции. Столбец может содержать значение NULL. |
| objectid | int | Идентификатор объекта (например хранимой процедуры или определяемой пользователем функции) для этого плана запроса. Для нерегламентированных и подготовленных пакетов этот столбец имеет значение NULL. Столбец может содержать значение NULL. |
| число | smallint | Целое число нумерованных хранимых процедур. Например, группа процедур для приложения заказов может называться orderproc; 1, orderproc; 2 и т. д. Для нерегламентированных и подготовленных пакетов этот столбец имеет значение NULL. Столбец может содержать значение NULL. |
| encrypted | bit | Указывает, зашифрована ли соответствующая хранимая процедура. 0 = не зашифрована 1 = зашифрована Столбец не может содержать значение NULL. |
| query_plan | nvarchar(max) | Содержит представление инструкции времени компиляции Showplan для плана выполнения запроса, заданного аргументом plan_handle. Инструкция Showplan имеет текстовый формат. Для каждого пакета, содержащего, например, нерегламентированные инструкции Transact-SQL, вызовы хранимых процедур и вызовы определяемых пользователем функций, формируется один план. Столбец может содержать значение NULL. |
Замечания
В следующих условиях выходные данные Showplan не возвращаются в столбце плана возвращаемой таблицы для sys.dm_exec_text_query_plan:
Если план запроса, определенный использованием аргумента plan_handle, извлекается из кэша планов, столбец query_plan возвращаемой таблицы имеет значение NULL. Например, это условие может произойти, если существует задержка времени между моментом захвата дескриптора плана и когда он использовался с sys.dm_exec_text_query_plan.
Некоторые инструкции Transact-SQL не кэшируются. К ним относятся инструкции массовых операций, а также инструкции, содержащие строковые литералы размером более 8 КБ. Шоупланы для таких инструкций не могут быть получены с помощью sys.dm_exec_text_query_plan , так как они не существуют в кэше.
Если пакет Transact-SQL или хранимая процедура содержат вызов определяемой пользователем функции или вызов динамической инструкции SQL, например с помощью команды EXEC (string), скомпилированная инструкция Showplan в формате XML для пользовательской функции не включается в таблицу, возвращаемую функцией sys.dm_exec_text_query_plan для пакета или хранимой процедуры. Вместо этого необходимо отдельно вызвать функцию sys.dm_exec_text_query_plan для plan_handle, соответствующего определяемой пользователем функции.
Если нерегламентированный запрос использует простую или принудительную параметризацию, столбец query_plan будет содержать только текст инструкции, а не фактический план запроса. Чтобы вернуть план запроса, вызовите sys.dm_exec_text_query_plan для дескриптора плана подготовленного параметризованного запроса. Вы можете определить, был ли запрос параметризован путем ссылки на столбец SQL представления sys.syscacheobjects или текстовый столбец sys.dm_exec_sql_text динамического административного представления.
Permissions
Для выполнения sys.dm_exec_text_query_plan пользователь должен быть членом роли стационарного сервера системного администратора или иметь VIEW разрешение SERVER STATE на сервере.
Разрешения для SQL Server 2022 и более поздних версий
Требуется VIEW разрешение на состояние производительности сервера на сервере.
Examples
А. Получение кэшированного плана запроса для медленно выполняемого запроса или пакета Transact-SQL
Если запрос или пакет Transact-SQL выполняется длительное время при определенном типе подключения к SQL Server, то для определения причины задержки необходимо получить план выполнения для этого запроса или пакета. В следующем примере показано, как получить инструкцию Showplan для медленно выполняемого запроса или пакета.
Note
Чтобы запустить этот пример, замените значения аргументов session_id и plan_handle на значения, соответствующие вашему серверу.
Сначала получите идентификатор сессии (SPID) процесса, выполняющего запрос или пакет, используя сохранённую sp_who процедуру:
USE master;
GO
EXEC sp_who;
GO
Набор результатов, возвращаемый , sp_who указывает, что идентификатор сессии — это 54. Вы можете использовать идентификатор сессии с режимом sys.dm_exec_requests динамического управления для получения дескриптора плана, используя следующий запрос:
USE master;
GO
SELECT * FROM sys.dm_exec_requests
WHERE session_id = 54;
GO
Таблица, возвращаемая sys.dm_exec_requests , указывает, что дескриптор плана для медленно выполняющегося 0x06000100A27E7C1FA821B10600запроса или пакета. Следующий пример возвращает план запроса для указанного дескриптора плана и использует значения по умолчанию 0 и -1 для возвращения всех инструкций в запросе или пакете.
USE master;
GO
SELECT query_plan
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);
GO
B. Получение плана каждого запроса из кэша планов
Чтобы получить моментальный снимок всех планов запроса, хранимых в кэше планов, необходимо получить дескрипторы планов для всех запросов, хранящихся в кэше, запросив динамическое административное представление sys.dm_exec_cached_plans. Дескрипторы планов хранятся в столбце plan_handle представления sys.dm_exec_cached_plans. Затем воспользуйтесь оператором CROSS APPLY для передачи дескрипторов плана в функцию sys.dm_exec_text_query_plan, как показано ниже. Выходные данные инструкции Showplan для каждого плана, находящегося сейчас в кэше планов, находятся в столбце query_plan возвращаемой таблицы.
USE master;
GO
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_text_query_plan(cp.plan_handle, DEFAULT, DEFAULT);
GO
C. Получение всех планов запросов, для которых сервер собирал статистику запросов, из кэша планов
Чтобы получить моментальный снимок всех планов запроса, для которых сервером была собрана статистика и которые в настоящий момент находятся в кэше планов, необходимо получить дескрипторы планов в кэше, запросив динамическое административное представление sys.dm_exec_query_stats. Дескрипторы планов хранятся в столбце plan_handle представления sys.dm_exec_query_stats. Затем воспользуйтесь оператором CROSS APPLY для передачи дескрипторов плана в функцию sys.dm_exec_text_query_plan, как показано ниже. Вывод инструкции Showplan для каждого плана находится в столбце query_plan возвращаемой таблицы.
USE master;
GO
SELECT * FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset);
GO
D. Получение сведений о первых пяти запросах по среднему времени ЦП
Следующий пример возвращает планы запросов и среднее время ЦП для пяти первых запросов. Функция sys.dm_exec_text_query_plan указывает значения по умолчанию 0 и -1 для возврата всех инструкций в пакете в плане запроса.
SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
Plan_handle, query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, 0, -1)
ORDER BY total_worker_time/execution_count DESC;
GO