我想查看在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
现在,在结果窗格中,查询计划未显示为超链接。如何在图形显示中查看该计划?
答案 0 :(得分:1)
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
仍然查看某些计划,尽管较大的计划仍然为空。请注意,使用COALESCE
或ISNULL
替换query_plan
的{{1}}列中的空值将不起作用,因为dm_exec_text_query_plan
的结果的数据类型将是优先级较高的数据类型(在这种情况下为XML),对于COALESCE
,这将是第一个参数的数据类型,从而导致与以前相同的XML转换错误。如果要从ISNULL
查看更大的计划,则可能需要研究其他选项,例如C#。
dm_exec_text_query_plan