План не отображается как гиперссылка при выборе из sys.dm_exec_text_query_plan - PullRequest
0 голосов
/ 27 марта 2019

Я хочу увидеть кэшированные планы запросов, которые были выполнены на моем 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 Ответ

1 голос
/ 27 марта 2019

Причина, по которой query_plan из 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 для просмотра некоторых планов, хотя для более крупных планов все равно будут значения NULL. Обратите внимание, что использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...