План не отображается как гиперссылка при выборе из sys.dm_exec_text_query_plan

#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