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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

英文原帖:

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

 

查询执行计划也可以从Extended Events会话通过query_post_execution_showplan事件获得。这是一个XEvent会话示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
Generated via  "Query Detail Tracking"  template.
*/
CREATE  EVENT SESSION [GetExecutionPlan]  ON  SERVER
ADD  EVENT sqlserver.query_post_execution_showplan(
ACTION (package0.event_sequence,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)),
/* Remove  any  of  the following events ( or  include additional events)  as  desired. */
ADD  EVENT sqlserver.error_reported(
ACTION (package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
WHERE  ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))  AND  [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD  EVENT sqlserver.module_end( SET  collect_statement=(1)
ACTION (package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
WHERE  ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))  AND  [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD  EVENT sqlserver.rpc_completed(
ACTION (package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
WHERE  ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))  AND  [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD  EVENT sqlserver.sp_statement_completed( SET  collect_object_name=(1)
ACTION (package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
WHERE  ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))  AND  [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD  EVENT sqlserver.sql_batch_completed(
ACTION (package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
WHERE  ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))  AND  [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD  EVENT sqlserver.sql_statement_completed(
ACTION (package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
WHERE  ([package0].[greater_than_uint64]([sqlserver].[database_id],(4))  AND  [package0].[equal_boolean]([sqlserver].[is_system],(0))))
ADD  TARGET package0.ring_buffer
WITH  (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY= ON ,STARTUP_STATE= OFF )
GO


在创建会话后,(在SSMS)定位到Object Explorer并下拉到Management | Extended Events | Sessions。右击“GetExecutionPlan”会话并启动它。再次右击它并选择“Watch Live Data”。

接下来,打开一个新的查询窗口并运行一个或多个查询。这是一个对AdventureWorks库的示例:

1
2
3
4
5
6
7
8
9
10
USE AdventureWorks;
GO
SELECT  p. Name  AS  ProductName,
NonDiscountSales = (OrderQty * UnitPrice),
Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM  Production.Product  AS  p
INNER  JOIN  Sales.SalesOrderDetail  AS  sod
ON  p.ProductID = sod.ProductID
ORDER  BY  ProductName  DESC ;
GO


一会儿后,你会在“GetExecutionPlan: Live Data”标签页看到一些结果。点击单元格中的一个query_post_execution_showplan事件,然后点在单元格下点击“Query Plan”标签页。它会看起来像这样:

clip_image002


编辑:这个XEvent代码和截屏来自于SQL/SSMS 2012 w/ SP2。如果你使用的是SQL 2008/R2,你可能需要稍微调整下脚本让它运行。但那个版本没有图形界面,所以你只能抽取XML格式的执行计划,保存为一个*.sqlplan文件并在SSMS中打开它。那是麻烦的。XEvents不存在于SQL 2005或之前的版本。因此,如果你不是使用SQL 2012或之后版本,我强烈建议你使用这里答复其他方法。

















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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
4月前
|
存储 关系型数据库 MySQL
MySQL查询执行计划详解(EXPLAIN)
一、单表查询 访问方法/访问类型: • const:通过主键值或唯一二级索引与一个常熟进行等值查询(不包括NULL),只会生成一条记录 • ref:普通二级索引与一个常数进行等值比较,可能生成多条记录 • ref_or_null:ref的前提下可以加上or key is null • range:对应的扫描区间为若干个单点扫描区间或范围扫描区间(不包括负无穷到正无穷的范围) • index:扫描区间为全表,但是可以在二级索引中扫描(因为二级索引每条记录占用空间更小,所以需要读的页更少) • all:直接扫描全部的聚集索引记录
|
11月前
|
SQL
explain分析查询
explain分析查询
49 0
|
11月前
|
SQL Oracle 关系型数据库
Oracle优化05-执行计划
Oracle优化05-执行计划
405 0
|
NoSQL MongoDB 开发者
索引的使用 执行计划 | 学习笔记
快速学习 索引的使用 执行计划
56 0
索引的使用 执行计划 | 学习笔记
|
SQL 存储 关系型数据库
几个必须掌握的SQL优化技巧(三):Explain分析执行计划
在应用的开发过程中,由于开发初期的数据量一般都比较小,所以开发过程中一般都比较注重功能上的实现,但是当完成了一个应用或者系统之后,随着生产数据量的急剧增长,那么之前的很多sql语句的写法就会显现出一定的性能问题,对生产的影响也会越来越大,这些不恰当的sql语句就会成为整个系统性能的瓶颈,为了追求系统的极致性能,必须要对它们进行优化。
240 0
几个必须掌握的SQL优化技巧(三):Explain分析执行计划
|
SQL
sql 查询优化小计
    好久没更博了,偷偷的抽时间写一下。     早上开始working的时候,发现一个页面加载很慢,经排查是昨天写的一条联合查询的sql导致的。于是着手优化!     首先想到的是在join的时候,减少表体积之后再进行关联,于是有了下面这种写法: (原sql) a join b on a.
796 0
|
SQL 数据库 索引
|
SQL 关系型数据库 MySQL