在Microsoft SQL Server中,如何获取查询/存储过程的查询执行计划?

推荐答案

获取执行计划的方法有很多种,具体使用哪种方法取决于您的情况.通常,您可以使用SQL Server Management Studio获取计划,但是,如果由于某种原因无法在SQL Server Management Studio中运行查询,则可以通过SQL Server Profiler或判断计划缓存来获取计划,这可能会有所帮助.

方法1-使用SQL Server Management Studio

SQL Server提供了一些简洁的功能,可以很容易地捕获执行计划,只需确保勾选"包含实际执行计划"菜单项(位于"查询"菜单下),然后正常运行查询即可.

包括行动执行计划菜单项

如果试图获取存储过程中语句的执行计划,则应执行存储过程,如下所示:

exec p_Example 42

查询完成后,您应该会在结果窗格中看到一个名为"执行计划"的额外选项卡.如果您运行了许多语句,那么您可能会在该选项卡中看到许多计划.

执行计划截图

从这里,您可以在SQL Server Management Studio中查看执行计划,或者右键单击该计划并 Select "将执行计划另存为…"以XML格式将计划保存到文件中.

方法2-使用SHOWPLAN选项

不过,如果Studio 1内部没有SQL Server的完整性管理方法,那么SQL Server的完整性管理方法是非常类似的.

在运行查询之前,请运行以下one条语句.该语句必须是批处理中的唯一语句,即不能同时执行另一条语句:

SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

这些是连接选项,因此每次连接只需运行一次.从这一点开始,运行的所有语句都将与包含所需格式的执行计划的additional resultset语句相比较——只需像通常看到计划一样运行查询即可.

完成后,可以使用以下语句关闭此选项:

SET <<option>> OFF

执行计划格式的比较

除非你有强烈的偏好,否则我的建议是使用STATISTICS XML选项.此选项相当于SQL Server Management Studio中的"包含实际执行计划"选项,并以最方便的格式提供最多的信息.

  • SHOWPLAN_TEXT-显示基于文本的基本估计执行计划,而不执行查询
  • SHOWPLAN_ALL-显示基于文本的估计执行计划和成本估计,而不执行查询
  • SHOWPLAN_XML-显示基于XML的估计执行计划和成本估计,而不执行查询.这相当于"显示估计的执行计划…"SQL Server Management Studio中的选项.
  • STATISTICS PROFILE-执行查询并显示基于文本的实际执行计划.
  • STATISTICS XML-执行查询并显示基于XML的实际执行计划.这相当于SQLServerManagementStudio中的"包含实际执行计划"选项.

方法3-使用SQL Server探查器

如果不能直接运行查询(或者直接执行查询时,查询运行速度不慢——请记住,我们希望查询的计划执行得不好),那么可以使用SQL Server Profiler跟踪捕获计划.这样做的目的是在捕获一个"Showplan"事件的跟踪运行时运行查询.

请注意,根据负载情况,您可以在生产环境中使用此方法,但显然应谨慎使用.SQL Server分析机制旨在将对数据库的影响降至最低,但这并不意味着不会对性能造成影响.如果数据库被大量使用,那么在跟踪中筛选和识别正确的计划也可能会有问题.显然,您应该向DBA咨询,看看他们是否对您在他们宝贵的数据库上这样做感到满意!

  1. 打开SQL Server Profiler并创建一个新的跟踪,该跟踪连接到您希望记录跟踪的所需数据库.
  2. Under the "Events Selection" tab check "Show all events", check the "Performance" -> "Showplan XML" row and run the trace.
  3. 在跟踪运行时,执行需要执行的任何操作,以运行运行运行缓慢的查询.
  4. 等待查询完成并停止跟踪.
  5. 要保存跟踪,请右键单击SQL Server Profiler中的计划xml,然后 Select "提取事件数据…"以XML格式将计划保存到文件.

您得到的计划相当于SQLServerManagementStudio中的"包含实际执行计划"选项.

方法4-判断查询缓存

如果不能直接运行查询,也不能捕获探查器跟踪,那么仍然可以通过判断SQL查询计划缓存来获得估计的计划.

我们通过查询SQL Server DMVs来判断计划缓存.下面是一个基本查询,它将列出所有缓存的查询计划(作为xml)及其SQL文本.在大多数数据库中,您还需要添加额外的筛选子句,以便将结果筛选到您感兴趣的计划.

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

执行此查询并单击计划XML以在新窗口中打开计划-右键单击并 Select "将执行计划另存为…"以XML格式将计划保存到文件.

Notes:

因为涉及的因素太多(从表和索引模式到存储的数据和表统计数据),所以您应该try 从感兴趣的数据库(通常是遇到性能问题的数据库)中获取执行计划.

无法捕获加密的执行计划.

"实际"与"估计"执行计划

actual执行计划指的是SQL Server实际运行查询的计划,而estimated执行计划指的是SQL Server在不执行查询的情况下完成其任务的计划.虽然在逻辑上是等效的,但实际执行计划更有用,因为它包含了有关执行查询时实际发生的情况的额外细节和统计信息.在诊断SQL Server估计值关闭的问题(例如统计数据过时)时,这一点非常重要.

如何解释查询执行计划?

这是一个足以让(免费)book人独立思考的话题.

另见:

Sql相关问答推荐

PostgreSQL集群不间断的数据系列

如何将数组列和与Click house中的另一个数组列的元素分组

仅在新值与旧值不同时才插入PostgreSQL

如何使用LinkHouse群组ArrayInsertAt以零作为位置参数

SQL从同一表连接列

如何将资源密集型自连接转换为更快的查询?

SQL Oracle条件分组依据

导出部分条形码字符串GS1-128

将用户授予另一个用户不授予权限

VS代码无法识别SQL代码中带括号的字符串

使用 SQL 将列添加到 Access 数据库时出错

SQL 查找 varchar 类型列及其值中多次出现的子字符串

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

Postgresql:在链接表中判断相关表中插入值的条件

将一名成员金额分配给群组内的其他成员

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

BigQuery数组是否包含NULL值的判断方法

Oracle PL/SQL长期运行问题

使用给定的变量对在循环中执行更新语句

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84