执行计划的阅读顺序为,从右到左,从上到下。
由执行计划表示的查询执行的一些特征如下:
- 如果查询由多个查询的批组成,每个查询的执行计划按照执行的顺序显示。批中的每个执行计划将有一个相对的估算开销,整个批的总开销为100%。
- 执行计划中的每个图标代表一个操作符。它们每个都有一个相对的估算开销,执行计划中的所有节点的总开销是100%。
- 执行计划中的一个起始操作符通常表示一个数据库对象(表或索引)的数据检索机制。
- 数据检索通常是一个表操作或一个索引操作。
- 索引上的数据检索将是索引扫描或索引超找。
- 索引上的数据检索的命名管理师[表名].[索引名]。
- 数据从右到左两个操作符之间流动,由一个连接箭头表示。
- 操作符之间连接箭头的宽度是传输行数的图形表示。
- 同一列的两个操作符之间的连接机制将是嵌套的循环连接,Hash匹配连接或者合并连接。
- 将光标防止在执行计划的一个节点之上,显示一个具有一些细节的弹出窗口。
- 在属性窗口中有完整的一组关于操作符的细节,可以右键单击操作符并选择属性。
- 操作符细节在顶部显示物理和逻辑操作的类型。物理操作代表存储实际使用的,而逻辑操作时优化器用于建立估算执行计划的结构。如果逻辑和物理操作相同,那么只显示物理操作。它还显示其他有用信息,如行数、I/O开销、CPU开销等。
- 操作符细节弹出窗口的参数部分在分析中特别有用,因为它显示了优化器所使用的过滤或连接条件。
执行计划中令人感兴趣的主要是查找哪些步骤相对开销较大。这些步骤是查询优化的出发点。可以通过采用下面的技术来选择开始的步骤。
- 执行计划中的每个节点显示其在整个执行计划中的相对开销,整个计划的总开销为100%。因此,关注有最高相对开销的节点。
- 执行计划可能来自于一批语句,因此可能也需要查找开销最大的语句。
- 查看节点之间连接箭头的宽度。非常宽的连接箭头表示对应节点之间传输大量的行。分析箭头左边的节点以理解其需要那么多行的原因,还要检查箭头的属性。可能看到估计的行和实际的行不一样,这可能由过时的统计造成。
- 寻找Hash连接操作。对于小的结果集,嵌套的循环连接通常是首选的连接技术。
- 寻找书签查找操作。对大结果集的书签操作可能造成大量的逻辑读。
- 可能由操作符之上有一个感叹号表示的警告,这是需要立刻注意的领域。这些警告可能是由各种问题造成的,包括没有连接条件的连接或丢失统计的索引和表。通常解决警告的情况将对性能有帮助。
- 寻找执行排序操作的步骤。这表示数据没有以正确的排序进行检索。
为了进一步研究执行计划中的开销较大的步骤,应该分析相关表或索引的数据检索机制。
首先,应该检查索引操作是查找这里扫描。通常,为了最佳性能,应该从一个表中检索尽量少的行,而索引查找通常是访问少量行的最有效方法。扫描操作通常代表着访问大量的行。因此,一般来说查找优先于扫描。
接下来,需要确保索引机制被正确建立。查询优化器评估可用的索引以发现哪个索引将以最有效的方式从表中检索数据。如果需要的索引不存在,优化器使用次佳的索引。为了最好的性能,应该始终确保在数据检索操作中使用最佳的索引。可以通过分析以下操作的节点细节中的参数部分来判断索引有效性:
- 数据检索操作;
- 连接操作;
最后一个访问执行计划的地方就是直接从保存它们的内存空间-计划缓存中读取。
SQL Server提供了动态管理视图和函数来访问这一数据。为了查看缓存中的执行计划列表,运行以下查询:
SELECT p.query_plan,t.text FROM sys.dm_exec_cached_plans r CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) p CROSS APPLY sys.dm_exec_sql_text(r.plan_handle) t
这个查询返回一个XML执行计划连接的列表。打开任何一个连接将显示执行计划,进一步通过动态管理视图处理可用的列,将使你能够搜索特定的过程或执行计划。