代码改变世界

【SQLServer】如何分析图形化的SQL执行计划

2022-09-27 08:53  abce  阅读(641)  评论(0编辑  收藏  举报

1.【SQLServer】SQLServer执行计划概览

2.【SQLServer】SQLServer执行计划的类型

 

SQL执行计划广泛用于通过监视和排除查询内部执行的方式来调整查询的性能。为了能够利用SQL执行计划,我们需要了解SQL执行计划提供的不同信息,直观可见的信息或者操作符隐藏的信息。你应该具有showplan权限才能生成执行计划。sysadmin、dbcreator或db_owner的成员无需任何额外权限即可生成执行计划。

让我们从一个简单的SQL执行计划开始。下面的SQL执行计划是执行简单的SELECT语句后生成的实际计划。可能会问,我如何区分它是实际的执行计划还是估计的执行计划。答案就是看执行计划图顶部的result页,如果有result页,就表示执行计划是实际执行sql后生成的。如果result页不存在,第一眼就就无法区分了。

SQL执行计划的上半部分显示了在同一会话中为多个查询生成执行计划的情况下,该查询相对于整体批处理成本的成本,如下图所示:

提交的查询语句也会显示在SQL执行计划的顶部。对于长查询语句,将显示尽可能多的适合窗口的查询语句内容。可以通过单击虚线方块在新窗口中获取完整的查询语句,如下所示:

在某些情况下,SQL Server查询优化器建议缺少索引,并给出创建索引后能提高多少比例的性能提高。会以绿色显示该建议。

可以通过点击功能选项“Missing Index Details”来查看创建索引的具体语句:

现在,我们已经很好地理解了图形化的执行计划的上半部分,在实线上方。让我们开始分析该行下方显示的信息。要正确阅读SQL执行计划,首先要知道执行的流程是从右到左,从上到下,最后一个运算符在左边,也就是大多数查询中的SELECT运算符,包含查询的最终结果。我们将在本系列的后面详细讨论你可能在执行计划中看到的所有运算符(operators)。

运算符之间的箭头表示SQL执行计划中这些运算符之间传递的数据的方向和数量。箭头的粗细表示运算符之间传递的数据量。从下图中可以得出,第二个箭头传递的数据量大于第一个箭头传递的数据量:

可以通过将鼠标指向该箭头,从箭头工具提示中获取通过该箭头的数据量,如下所示:

不仅箭头所传递的行数可以通过箭头导出,而且其他有用的信息也隐藏在这个箭头后面。此信息包括每个传递的行的大小和通过箭头的数据的总大小。箭头的粗细也可以显示性能问题。例如,如果执行计划显示粗箭头,则通过箭头的行数很大,在计划的开头和通过最后一个箭头粗,查询返回的行数很小,则对应该修复的表或索引执行不正确的扫描操作。箭头的粗细也可以指示性能问题。 例如,如果执行计划显示粗箭头,则通过箭头的行数很大,在计划的开头和最后一个箭头粗,查询返回的行数很小,则应该是对表执行了不正确的扫描操作或某个索引需要修复。

在每个运算符下方,将显示一个百分比数字,表示SQL Server查询优化器对该运算符成本相对于总体查询成本的估计。在我们的示例中,可以看到所有估计的成本都与Clustered Index Seek运算符有关,如下所示:

在使用SQL执行计划查看分析工具ApexSQL Plan时,无需点击组件即可显示代表每个运算符顶部统计的重要数字和箭头,如下图:

是不是一切都可以从执行计划中得出?答案肯定是NO。在执行计划中,每个运算符背后都隐藏着其他信息。只需将鼠标指向计划中的任何运算符,就会显示该运算符的信息提示,其中包含有关运算符的统计信息和完整描述。例如,如果将鼠标指针悬停在Clustered Index Seek运算符上,将显示该运算符的相关提示。

显示的弹出窗口包含:
··选定运算符的定义如下

··关于运算符的统计信息,例如I/O和CPU成本。这些数字并不代表此运算符实际消耗的资源量,它代表SQL Server查询优化器在执行期间分配的估计成本。这些信息有助于了解执行查询时内部发生的情况,如下所示:

我们通常专注于运算符的子树成本,它代表SQL Server引擎到目前为止查看的执行树,从右到左,从上到下。在由大量运算符组成的复杂计划中,计划的全部成本可以从最终的操作累积得出,在我们的例子中就是SELECT运算符。

你还应该注意运算符提示中的有序布尔值。该值指示当前运算符正在处理的数据是否已排序,这有助于说明为什么在查询的该步骤中需要额外处理。NODE ID值表示SQL Server查询优化器分配的运算符的编号顺序。

实际执行计划运算符显示实际和估计统计信息。另一方面,Estimated Execution Plan仅显示Estimated统计数据。在大多数情况下,实际值和估计值是相同的。如果不是,则该数据库表或索引的统计信息已过时,应更新,如下所示:

··使用的索引、检索到的列列表以及用于过滤该运算符中数据的条件的信息,如下所示:

运算符的属性窗口为我们提供了运算符工具提示中未列出的额外信息。如果你右键单击任何运算符并选择属性窗口,或者只需单击该运算符并单击F4,将显示该运算符的属性窗口。 显示的窗口将向我们展示更多有用的信息,这些信息代表SQL Server在该运算符中处理数据时的行为方式。
单击该属性将显示该属性的描述,对于大多数属性但不是全部,这使得它更容易理解。旁边带(+)号的属性是可展开的属性,可以显示额外的信息,如下图:

至此,我们已经很好地理解了SQL执行计划组件以及如何从右到左、从上到下读取它,并且我们需要专注于更高百分比的运算符,最粗的箭头,最大的子树成本、非有序数据、SCAN运算符……等。

 

本文地址:https://www.cnblogs.com/abclife/p/16702376.html