英文原帖:

http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan

有很多方法获得执行计划,使用哪种根据情况决定。通常你可以使用SQL Server Management Studio来获得执行计划,然而如果因为某些原因你不能在SQL Server Management Studio中运行查询,那么你会发现SQL Server Profiler或者探测执行计划缓存会对获得执行计划有帮助。

方法1 – 使用SQL Server Management Studio

SQL Server有很多简单属性让我们非常容易捕获执行计划,简单来说确保“Include Actual Execution Plan”菜单(在“Query”菜单下可被找到)被选中,并运行查询。

如果你尝试对存储过程中的语句获得执行计划,那么你应该执行该存储过程,像这样:

1
exec p_Example 42

当查询执行完成,你会看到一个额外的“Execution plan”标签页出现在结果面板。如果你运行了很多语句,你会在这个标签页看到很多执行计划。

从这里你可以在SQL Server Management Studio里检查到执行计划,或者在面板上右击并选择“Save Execution Plan As…”保存执行计划到一个XML格式文件。

方法2 – 使用SHOWPLAN选项

该方法非常类似于方法1(事实上这是SQL Server Management Studio的内部实现),然而我包含它用于完成或者如果你没有SQL Server Management Studio可用。

在运行你的查询之前,运行以下语句之一。语句必须是这批语句中的唯一一个,例如,你不能在同时执行另一个语句:

1
2
3
4
5
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

这些是连接级别的选项,因此你只需对每个连接运行一次。这么说所有运行的语句完成后,将会有一个包含以你期望的格式的执行计划的额外结果集 – 像平常一样运行你的查询就会看到这个面板。

一旦执行完后,你可以使用如下语句关闭这个选项:

1
SET <<option>> OFF

比较执行计划格式

除非你有非常强烈的偏好,我的推荐是使用STATISTICS XML选项。这个选项等于SQL Server Management Studio中的“Include Actual Execution Plan”选项,并以最方便的格式提供了最丰富的信息。

. SHOWPLAN_TEXT – 显示了一个基本的基于文本的预估执行计划,而不必执行查询。

. SHOWPLAN_ALL – 显示带有消耗预估值的基于文本的预估执行计划,而不必执行查询。

. SHOWPLAN_XML – 显示带有消耗预估值的基于XML的预估执行计划,而不必执行查询。等于在SQL Server Management Studio中的“Display Estimated Execution Plan…”选项。

. STATISTICS PROFILE – 执行查询并显示基于文本的实际执行计划。

. STATISTICS XML – 执行查询并显示基于XML的实际执行计划。等于在SQL Server Management Studio中的“Include Actual Execution Plan”选项。

方法3 – 使用SQL Server Profiler

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

注意在生产环境上根据负载情况使用该方法,显然你应该小心使用。SQL Server Profiling架构被设计为最小化数据库影响,但是并不意味着没有任何性能影响。如果数据在高负载下使用,在你的跟踪里过滤和识别正确的执行计划也有问题。你显然应该与DBA一起看看他们是否愿意你在珍贵的数据库上做这些!

  1. 打开SQL Server Profiler并创建一个新的跟踪,连接到你想记录跟踪的数据库上。

  2. 在“Event Selection”标签下选择“Show all events”,选择“Performance”->“Showplan”行并运行跟踪。

  3. 当跟踪运行时,你需要去做的是运行该慢查询。

  4. 等待查询完成并停止跟踪。

  5. 为了保存跟踪,在SQL Server Profiler中右键点击XML格式执行计划,并选择“Extract event data..”来以XML格式保存执行计划。

你获得的执行计划等于在SQL Server Management Studio中选择“Include Actual Execution Plan”选项。

方法4 – 探测查询缓存

如果你不能直接运行查询,并且你也不能捕获Profiler跟踪,你仍然可以通过探测SQL查询的执行计划缓存获得预估的执行计划。

我们通过查询SQL Server DMV探测执行计划缓存。以下是一个基本的查询,用于列出所有的查询计划(以XML格式)以及它们的SQL文本。对大多数数据库你也需要添加额外的过滤从句,过滤出你感兴趣的执行计划。

1
2
3
4
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格式的执行计划,来在新窗口打开该这行计划 – 右键点击并选择“Save execution plan as …”以XML格式保存执行计划到文件。

注意:

因为有很多因素(从表和索引结构到数据存储和表统计信息)促使你应该总是从你感兴趣的(通常是经历一个性能问题的数据库)数据库获得执行计划。

你不能捕获加密存储过程的执行计划。

“actual”VS“estimated”执行计划

实际执行计划是SQL Server实际运行查询时的执行计划,而预估执行计划是SQL Server在没有执行查询时预估出要做什么。尽管逻辑上相等,实际执行计划更有用应该它包含了当查询执行时实际发生了什么的额外的细节和统计信息。当在SQL Server预估值为OFF的地方诊断问题的时候,它是必须的(例如当统计信息过期时)。

. 重新回顾预估和实际执行计划

如果解释一个查询的执行计划?

该主题值得写一本书《SQL Server Execution Plan》。(译者注:该书已出第2版)

参考:

. 执行计划基础

. SHOWPLAN许可和Transact-SQL批处理

. SQL Server 2008 – 使用查询哈希和查询执行计划哈希

. 分析SQL Server执行计划缓存

本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1735400 ,如需转载请自行联系原作者

如何获得查询的执行计划?(一)相关推荐

  1. t-sql执行结果_解释T-SQL查询的执行计划

    t-sql执行结果 In this article, we will analyze a simple T-SQL query execution plan with different aspect ...

  2. 查询sql执行计划_使用SQL执行计划进行查询性能调整

    查询sql执行计划 In the previous articles of this series (see the index at bottom), we went through many as ...

  3. 使用explain查询select查询语句执行计划

    1.使用explain查询select查询语句执行计划 mysql> select * from baba where name ='fjdsjf'; +------+--------+ | i ...

  4. 并行查询的执行计划解读

    in-out字段的pcwc或是pcwp代表什么意思? 一.执行计划里的(单独型)操作一般都是子操作在父操作前面执行,表现在并行查询语句的执行计划里的in_out字段(执行计划里当发生并行查询时才会出现 ...

  5. MySQL慢查询与执行计划分析

    MySQL慢查询与执行计划分析 慢查询分析 执行计划分析 表结构分析 慢查询分析 查看是否开启慢日志: show variables like 'slow_query_log%'; +-------- ...

  6. Mysql 慢查询 Sql执行计划 SQL每阶段的耗时

    文章目录 前言 一.慢查询的相关参数 slow_query_log 是否开启了慢查询 开启慢查询 slow_query_log_file 指定慢查询日志的存储路径及文件 long_query_time ...

  7. 07-MySql 慢查询分析-执行计划篇

    文章目录 MySql执行计划 一.执行计划的作用 二.使用方式 三.含义分析 3.1 id 3.2 select_type 3.3 table 3.4 Type 3.5 possible_keys 3 ...

  8. mysql 执行计划不对_关于mysql主从查询执行计划不一致问题的分析

    最近面试过程中被面试官抛了一个问题,说曾经有一个线上出现的奇怪的问题,主库和从库各种配置是一致的,当数据量比较大的时候,某些时候同样的查询,在从库里的执行计划执行成功了,而主库里没有执行这个执行计划, ...

  9. 如何在SQL Server 2016中比较查询执行计划

    SQL Server 2016 provides great enhancement capability features for troubleshooting purposes. Some of ...

最新文章

  1. Exchange 2013与OWA13集成
  2. PHP中file_exists与is_file,is_dir的区别介绍
  3. BitSet 数字排序
  4. 最新 MSDN Library for Visual Studio 2008 SP1
  5. 可调整大小的div_气液增压缸运行速度的调整以及压力的调节方式
  6. LeetCode 406 根据身高重建队列
  7. python函数返回布尔值_python-3.x - 函数不返回正确的布尔值 - SO中文参考 - www.soinside.com...
  8. 汽车上有哪些很难发现却非常实用的配置?
  9. VC预处理指令与宏定义的妙用
  10. java案例代码3-机票打折的案例
  11. 如何在windows10电脑上创建ftp站点
  12. MATLAB图像处理之图像去模糊处理
  13. 数据库在一对一、一对多、多对多怎么设计表关系
  14. UVA 1391 - Astronauts(2-SET)
  15. 判断二元关系的性质:自反性、对称性、传递性
  16. ⅰsee是什么意思_l see 什么意思
  17. 解决退格键在MinGW的vim中不起作用的问题
  18. warning: iteration xxxu invokes undefined behavior [-Waggressive-loop-optimizations]
  19. 免费软件 Cmd GUI Shell(图形界面的命令提示符壳)-beta3
  20. python爬虫详解(三)——爬取世界常用密码并保存到字典内

热门文章

  1. 动态规划位置hdu 4540 威威猫系列故事——打地鼠(动态规划)
  2. CSS的伪类 :before 和 :after
  3. 3星|《大产品,小团队》:携程软件开发流程改进的故事
  4. Redis 3.2.x版本 redis.conf 的配置文件参数详解
  5. C++走向远洋——52(十三周阅读程序)
  6. Struts2笔记——通配符和动态方法调用
  7. 版本管理器subversion的简单配置以及和apache的结合使用
  8. 「Linux」Linux下根据CET听力文件关键字和lcr时间对mp3进行剪辑分割
  9. 手机扣费软件大曝光 金山手机卫士帮您免费检测
  10. 大数据开发笔记(八):Spark综合笔记总结