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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

英文原帖:

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 ,如需转载请自行联系原作者


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
5月前
|
存储 关系型数据库 MySQL
MySQL查询执行计划详解(EXPLAIN)
一、单表查询 访问方法/访问类型: • const:通过主键值或唯一二级索引与一个常熟进行等值查询(不包括NULL),只会生成一条记录 • ref:普通二级索引与一个常数进行等值比较,可能生成多条记录 • ref_or_null:ref的前提下可以加上or key is null • range:对应的扫描区间为若干个单点扫描区间或范围扫描区间(不包括负无穷到正无穷的范围) • index:扫描区间为全表,但是可以在二级索引中扫描(因为二级索引每条记录占用空间更小,所以需要读的页更少) • all:直接扫描全部的聚集索引记录
|
SQL
explain分析查询
explain分析查询
57 0
|
NoSQL MongoDB 开发者
索引的使用 执行计划 | 学习笔记
快速学习 索引的使用 执行计划
索引的使用 执行计划 | 学习笔记
|
SQL 存储 关系型数据库
几个必须掌握的SQL优化技巧(三):Explain分析执行计划
在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。
285 0
几个必须掌握的SQL优化技巧(三):Explain分析执行计划
|
SQL 索引 存储
执行计划的生成
原文:执行计划的生成   SQL Server使用许多技术来优化资源消耗: 基于语法的查询优化; 无用计划匹配以避免对简单查询的深度优化; 根据当前分布统计的索引和连接策略; 多阶段的查询优化以控制优化开销; 执行计划缓冲以避免重新生成执行计划;   以上技术按以下顺序执行: 解析器; 代数化器; 查询优化器; 执行计划生成,缓冲和hash计划生成; 查询执行;   其执行顺序如下:    一、解析器(parser)   当查询被提交时,SQL Server将它传递给关系引擎中的解析器。
1122 0
|
SQL 数据库 索引
|
SQL 关系型数据库 MySQL

相关课程

更多
下一篇
无影云桌面