sql - 如何在 SQL Server 中获取查询执行计划?

标签 sql sql-server performance tsql sql-execution-plan

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

最佳答案

有多种获取执行计划的方法,使用哪种方法取决于您的情况。通常您可以使用 SQL Server Management Studio 来获取计划,但是如果由于某种原因您无法在 SQL Server Management Studio 中运行您的查询,那么您可能会发现能够通过 SQL Server Profiler 或通过检查来获取计划会很有帮助计划缓存。

方法 1 - 使用 SQL Server Management Studio

SQL Server 带有一些简洁的功能,可以很容易地捕获执行计划,只需确保勾选“包括实际执行计划”菜单项(位于“查询”菜单下)并正常运行查询.

Include Action Execution Plan menu item

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

exec p_Example 42

查询完成后,您应该会在结果 Pane 中看到一个名为“执行计划”的额外选项卡。如果您运行了许多语句,那么您可能会看到此选项卡中显示了许多计划。

Screenshot of an Execution Plan

从这里您可以在 SQL Server Management Studio 中检查执行计划,或右键单击该计划并选择“将执行计划另存为...”以将计划保存为 XML 格式的文件。

方法 2 - 使用 SHOWPLAN 选项

此方法与方法 1 非常相似(实际上这是 SQL Server Management Studio 在内部执行的操作),但是为了完整性或如果您没有可用的 SQL Server Management Studio,我将其包含在内。

在运行查询之前,运行 以下陈述。该语句必须是批处理中唯一的语句,即您不能同时执行另一个语句:
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

这些是连接选项,因此每个连接只需运行一次。从这一点开始,所有运行的语句都将伴随着 附加结果集 包含所需格式的执行计划 - 只需像往常一样运行查询即可查看计划。

完成后,您可以使用以下语句关闭此选项:
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 的实际执行计划。这相当于 SQL Server Management Studio 中的“包括实际执行计划”选项。

  • 方法 3 - 使用 SQL Server Profiler

    如果您不能直接运行您的查询(或者您的查询在您直接执行时不会运行缓慢 - 请记住,我们想要一个执行不佳的查询计划),那么您可以使用 SQL Server Profiler 跟踪捕获一个计划。这个想法是在捕获“Showplan”事件之一的跟踪正在运行时运行您的查询。

    请注意,取决于您的负载 可以 在生产环境中使用此方法,但显然您应该谨慎使用。 SQL Server 分析机制旨在最大限度地减少对数据库的影响,但这并不意味着不会对性能产生任何影响。如果您的数据库被大量使用,您也可能在过滤和识别跟踪中的正确计划时遇到问题。您显然应该咨询您的 DBA,看看他们是否对您在他们宝贵的数据库上执行此操作感到满意!
  • 打开 SQL Server Profiler 并创建一个连接到您希望记录跟踪的所需数据库的新跟踪。
  • 在“事件选择”选项卡下,选中“显示所有事件”,选中“性能”->“显示计划 XML”行并运行跟踪。
  • 在跟踪运行时,执行任何您需要执行的操作以使运行缓慢的查询运行。
  • 等待查询完成并停止跟踪。
  • 要保存跟踪,请右键单击 SQL Server Profiler 中的计划 xml,然后选择“提取事件数据...”以将计划保存为 XML 格式的文件。

  • 您获得的计划相当于 SQL Server Management Studio 中的“包括实际执行计划”选项。

    方法 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 以在新窗口中打开计划 - 右键单击​​并选择“将执行计划另存为...”以将计划以 XML 格式保存到文件中。

    笔记:

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

    您无法捕获加密存储过程的执行计划。

    “实际”与“估计”执行计划

    实际执行计划是 SQL Server 实际运行查询的地方,而估计的执行计划 SQL Server 计算出它在不执行查询的情况下会做什么。尽管在逻辑上是等价的,但实际的执行计划更有用,因为它包含有关执行查询时实际发生的情况的其他详细信息和统计信息。这在诊断 SQL Server 估计值关闭的问题(例如统计数据过时时)时至关重要。
  • Estimated and Actual execution plan revisited

  • 如何解释查询执行计划?

    这是一个足够(免费)的话题book在自己的权利。

    也可以看看:
  • Execution Plan Basics
  • SHOWPLAN Permission and Transact-SQL Batches
  • SQL Server 2008 – Using Query Hashes and Query Plan Hashes
  • Analyzing the SQL Server Plan Cache
  • 关于sql - 如何在 SQL Server 中获取查询执行计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7359702/

    相关文章:

    c# - 如何使用 C# 代码将大量数据插入 SQL Server 2008?

    javascript - JavaScript 性能中的空数组测试

    sql - 检查逗号分隔列表是否包含特定数字

    sql - 在sql server中同步2个表

    php - SQL 和 PHP - mysqli_num_rows() 或 'select count()' 哪个更快?

    c# - 为什么'Weiss'='Weiß'或通过Unicode列在SQL Server中搜索

    c# - 插入,选择,删除的SQL Server死锁

    java - 将 PNG 加载到 OpenGL 性能问题 - Java 和 JOGL 比 C# 和 Tao.OpenGL 慢得多

    mongodb 查询非常慢

    MySQL 数据库 JOIN 表和搜索 WHERE <多列>