博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何获得查询的执行计划?(一)
阅读量:6590 次
发布时间:2019-06-24

本文共 2978 字,大约阅读时间需要 9 分钟。

英文原帖:

有很多方法获得执行计划,使用哪种根据情况决定。通常你可以使用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 探测执行计划缓存。以下是一个基本的查询,用于列出所有的查询计划(以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的地方诊断问题的时候,它是必须的(例如当统计信息过期时)。

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

该主题值得写一本书。(译者注:该书已出第2版)

参考:

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

你可能感兴趣的文章
Linux socket多进程服务器框架三
查看>>
Debug.print的用法
查看>>
常用名词
查看>>
计算机硬件常识
查看>>
第一百三十四节,JavaScript,封装库--遮罩锁屏
查看>>
【转】cookie如何共享到各个浏览器
查看>>
自制基于HMM的python中文分词器
查看>>
如何在Root的手机上开启ViewServer,使得HierachyViewer能够连接
查看>>
重写和重载
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-新增锁定用户与解除锁定用户的功能...
查看>>
vue1.0 的过滤器
查看>>
如何删除anaconda
查看>>
Mybatis3.3——源码阅读笔记
查看>>
oracle中的trunc函数操作
查看>>
杂牌蓝牙在2003系统使用新驱动的破解方法!
查看>>
EventCache表太大, 怎么办?
查看>>
Top 10 mistakes in Eclipse Plug-in Development
查看>>
Directx教程(23) 简单的光照模型(2)
查看>>
使用sphinx来创建文档
查看>>
[转]用了docker是否还有必要使用openstack?
查看>>