如何获得查询的执行计划?(一)-阿里云开发者社区

开发者社区> 数据库> 正文

如何获得查询的执行计划?(一)

简介:

英文原帖:

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”菜单下可被找到)被选中,并运行查询。

clip_image001[4]


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

1
exec p_Example 42


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

clip_image003[4]


从这里你可以在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 ,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章