#sql-server #ssms
#sql-сервер #ssms
Вопрос:
Я хочу увидеть кэшированные планы запросов, которые были выполнены на моем SQLServer.
Когда я запрашиваю план у sys.dm_exec_query_plan
SQLServer Management Studio, он отображается в виде гиперссылки. Я нажимаю на эту ссылку, открывается новая вкладка и отображает план.
SELECT p.query_plan
FROM sys.dm_exec_cached_plans ps
OUTER APPLY sys.dm_exec_query_plan(ps.plan_handle) p
Я прочитал, что sys.dm_exec_query_plan
может вернуться NULL
при определенных обстоятельствах, и поэтому хочу запросить данные моего плана из sys.dm_exec_text_query_plan
SELECT p.query_plan
FROM sys.dm_exec_cached_plans ps
OUTER APPLY sys.dm_exec_text_query_plan(ps.plan_handle, 0, -1) p
Теперь в области результатов план запроса не отображается в виде гиперссылки. Как я могу просмотреть этот план на графическом дисплее?
Ответ №1:
Причина, по которой query_plan
from dm_exec_query_plan
отображается гиперссылка, заключается в том, что она имеет XML
тип данных, в NVARCHAR(MAX)
котором этот столбец является dm_exec_text_query_plan
типом данных. Вы можете преобразовать этот столбец из dm_exec_text_query_plan
в XML для отображения в том же формате, что и dm_exec_query_plan
, однако иногда это приводит к XML datatype instance has too many levels of nested nodes. Maximum allowed depth is 128 levels.
ошибке для более крупных планов. Одним из вариантов является использование TRY_CONVERT
для просмотра некоторых планов, хотя для более крупных планов все равно будут нули. Обратите внимание, что использование COALESCE
или ISNULL
для замены нулей в query_plan
столбце в dm_exec_text_query_plan
не сработает, поскольку типом данных результата для COALESCE
будет тип данных с более высоким приоритетом (в данном случае XML), а для ISNULL
это будет тип данных первого аргумента, что приведет к той же ошибке преобразования XML, что и раньше. Если вы хотите просмотреть более крупные планы из dm_exec_text_query_plan
, вам может потребоваться изучить другой вариант, такой как C #.
SELECT
TRY_CONVERT(XML, p.query_plan) AS QueryPlan
FROM sys.dm_exec_cached_plans ps
OUTER APPLY sys.dm_exec_text_query_plan(ps.plan_handle, 0, -1) p