使用ssms 2012查询2008R2实例,我试图使用像这样的DMV来获取特定查询的计划:
SELECT t.text
, p.query_plan
from sys.dm_exec_query_stats qs
cross join sys.dm_exec_sql_text(qs.sql_handle) t
cross join sys.dm_exec_text_query_plan(qs.plan_handle,0,-1) p
where t.text like ...
查询计划列在43,479个字符后被切断。以
结尾 < /Outp
而不是
< /ShowPlanXML>
我用较小的查询对此进行了测试,并返回了整个文本。有问题的查询并不复杂,但有很多列,可能会使它更冗长。此外,返回的值不是计划的链接,而只是文本形式的XML 计划缓存中存储的内容是否有限制,或者我在SSMS中做错了什么,它没有将值作为计划链接返回到列中?
答案 0 :(得分:0)
即使Aaron在评论中提到的错误在这里发挥作用,你也应该能够通过SSMS调整来解决它。您可以直接将查询结果转换为xml数据类型,然后以这种方式返回。
如果您要在网格视图中返回XML,请转到工具/选项/查询结果/ SQL Server /结果到网格,并查看为XML数据检索的最大字符数设置是什么,并将其提升为“无限”。这应该允许你绕过varchar限制。
答案 1 :(得分:0)
糟糕!错误的DMV。我需要使用dm_exec_query_plan而不是dm_exec_text_query_plan。这解决了 - 感谢回复。
答案 2 :(得分:0)
发布另一个答案,因为这可能有助于其他人将来出局。我发现有一些方法可以解决网格视图中显示的输出中的43,479个字符限制,这是特定于此问题的。如果您的计划超出了128个嵌套节点的SQL XML数据类型限制,这些方法也可以使用。
第一个也是最简单的选择是启动PowerShell ISE并按照this blog post by Patrick Keisler中列出的说明进行操作。将他的脚本粘贴到ISE编辑器中,调整OFFSET值(推荐),输出路径/名称,然后运行所有内容以生成最终的sqlplan文件。
如果您不想使用PowerShell,我也可以使用拼凑在一起的 kludgy TSQL方法,如下所示:
-- Quick and dirty script to output large execution plans from cache
-- Be sure to replace Plan Handle and Offset Values Below
DECLARE @query_plan_nvarmax NVARCHAR(MAX), @len_out INT, @sub_str INT = 0, @sub_end INT = 43679
DECLARE @full_query_plan TABLE
(
line INT IDENTITY(1,1),
qp_line NVARCHAR(MAX)
)
SELECT @query_plan_nvarmax = query_plan,
@len_out = LEN(query_plan)--, CAST(query_plan AS XML) as xml_query_plan
-- Usage: Get Query Offset Values From sys.dm_exec_query_stats DMV
-- sys.dm_exec_text_query_plan(plan_handle, OFFSET_START|DEFAULT, OFFSET_END|DEFAULT)
FROM sys.dm_exec_text_query_plan(0x050005005EDA4857307D56540300000001000000000000000000000000000000000000000000000000000000, 10078, 83616)
WHILE @sub_str < @len_out
BEGIN
INSERT INTO @full_query_plan (qp_line)
SELECT SUBSTRING(@query_plan_nvarmax, @sub_str, @sub_end)
SET @sub_str = @sub_end
SET @sub_end = @sub_end + 43679
IF @sub_end > @len_out
SET @sub_end = @len_out
END
-- Save Output of qp_line column to text editor and remove newline characters \r\n
-- I prefer Notepad++, but any editor will suffice then save output as a .sqlplan and open in SSMS
SELECT *
FROM @full_query_plan
请注意,您需要在外部文本编辑器中编辑查询的输出,以删除换行符\r\n
并将结果另存为.sqlplan
文件。