在 Server Management Studio 中显示查询计划

Gai*_*ius 9 performance sql-server-2005

另一个 SQL 服务器问题:我有一个简单的查询,它提供了自计数器重置以来 CPU 最密集的 SQL:

select top 10  
    sum(qs.total_worker_time) as total_cpu_time,  
    sum(qs.execution_count) as total_execution_count, 

    qs.plan_handle, st.text  
from  
    sys.dm_exec_query_stats qs 
cross apply sys.dm_exec_sql_text(qs.plan_handle) as st
group by qs.plan_handle, st.text 
order by sum(qs.total_worker_time) desc
Run Code Online (Sandbox Code Playgroud)

问题1:究竟是什么plan_handle?它似乎不是计划的散列,就像在 Oracle 中一样。我问是因为我希望能够检测语句的计划发生变化的情况。

问题2:一旦有了plan_handle,我就对实际的计划感兴趣。所以我这样做,例如:

select * from sys.dm_exec_query_plan (0x060006001F176406B8413043000000000000000000000000)
Run Code Online (Sandbox Code Playgroud)

在 query_plan 列中,我得到一个链接,单击该链接时会显示一个 XML 文档。如果我将它作为whatever.sqlplan 保存在磁盘上,我可以在Windows 中双击它并在Management Studio 中正确显示。一定有办法避免这一步吗?!

问题 3:有没有办法将 XML 转换回文本格式,就像过去的 SET SHOWPLAN_TEXT 一样?我希望能够以图形方式查看它们,但也希望以某种有意义的方式自动比较它们。

谢谢!

SQL*_*tar 9

A1:plan_handle 是一组语句或批处理的散列。

A2:不,dm_exec_query_plan 返回 XML 格式的查询计划,因此您需要单击它才能查看图表。

A3. 尝试这个:

SELECT query_plan 
FROM sys.dm_exec_text_query_plan (0x06000100A27E7C1FA821B10600,0,-1);
Run Code Online (Sandbox Code Playgroud)

  • 我返回 `<ShowPlanXML xmlns="http://schemas.microsoft.com...` 但仍然无法直接显示它 - 我需要先将它作为 `.sqlplan` 文件保存到磁盘。奇怪。谢谢你 :) (2认同)

Jef*_*eff 7

我在 Wrox Press 的 SQL Server 2008 Internals and Troubleshooting 书中发现了以下提示:

如果您使用连接到 SQL 2005 服务器的 SQL 2008 SSMS,当您单击 XML 查询计划时,它会自动为您加载图形查询计划。

我使用同一本书中的以下查询验证了它是否有效:

select session_id, text, query_plan
from sys.dm_exec_requests
cross apply sys.dm_exec_sql_text(sql_handle)
cross apply sys.dm_exec_query_plan(plan_handle)
Run Code Online (Sandbox Code Playgroud)

此外,如果您还没有看过它,请查看 SQL Sentry 的免费计划资源管理器。您必须首先将 XML 作为 .sqlplan 保存到磁盘,但它提供了更易于使用的 SQL 执行计划视图。希望有一天有人会想出一个可视化执行计划差异工具。:D