SQLServer中的执行引擎介绍

本文的目的是对执行计划中每个操作的相关信息进行分类。

数据访问操作

首先,最基本的操作来访问数据。这可以通过直接访问表或通过访问索引,表的数据结构的堆(heap)和B树聚簇索引数据组织通过堆没有表,这个表是无序的,建立一个聚簇索引和非聚簇索引数据的B树的方式组织,这种方式是按存储的数量。一般来说,一个非聚集索引只包含一些列的表,以及滤波器的指标,只有一些行包括。

除了数据组织方式外,数据访问也分为两种:扫描(查找)和查找(查找)。扫描是扫描整个结构的所有数据,而搜索只是寻找整个结构中的一部分数据,因此可以看出,由于堆乱了,不可能在堆栈上搜索(查找)操作。与B树的顺序相比,可以在B树中找到。当为一个堆组织表访问数据时,将执行堆扫描,如图1所示。



图1。表扫描

正如您所看到的,表扫描图标清楚地显示了表扫描的性质,并在无序的组织表中从头到尾地扫描它。

至于聚类索引B树结构和非聚集索引,同样可以进行扫描,一般来说,为了获得索引中的所有数据,在一个表或索引中得到的大部分扫描数据树所占的成本小于搜索,将被聚类索引扫描。如图2所示。



图2。聚集索引扫描

索引扫描图标还可以清楚地显示聚集索引扫描的性质。在找到最左边的叶节点之后,所有叶子节点都被扫描以扫描整个结构。当然,对于非聚集索引,同样的概念也是一样的,如图3所示。



图3。非聚集索引的扫描

对于B树结构中的一部分数据,索引查找使B树有意义,根据键值,可以从B树根到单一路径,从而减少扫描页面的不必要消耗。图4是查询计划中的索引查找。



图4。聚集索引查找

索引查找图标也很生动,你可以看到图标从根节点到叶节点的线。它是在数据页找到,不难看出,如果我们需要找到多个数据分散在不同的页面,搜索操作应重复多次,当这个数目足够大时,SQL Server会选择一个相对较低的消费指数扫描和不重复的索引,非聚集索引查找,是同一个概念,而不再是对。

书签查找(书签查找)

您可能认为,如果非聚集索引可以很快找到数据,但不幸的是,当非聚集索引不包含所有必需的列时会发生什么在这一点上,SQL Server将面临两种选择:直接访问基础表获取数据或非聚集索引查找数据,然后去基本表得到,不受非聚集索引的列,选择取决于行和其他统计信息的查询分析器的估计数。会选择少消耗一。

图5显示了一个简单的书签查找。



图5。一个简单的书签查找

从图5可以看出,第一个非聚集索引的发现就行了,但这个指标并不包括所有的列,所以你必须找到这些额外的基础表中的列,所以找钥匙,如果基本表的堆组织,然后重点查找(查找)将摆脱搜索(RID查找),关键和摆脱查询书签查找。

然而,有时索引查找返回的行数太多,这使得书签查找的性能大大低于直接扫描操作。因此,SQL Server将选择扫描而不是书签,如图6所示。



图6.stateprovinceid列有一个非聚集索引,但由于返回的行数太大,该分析仪选择扫描代替书签查找。

这个估计是以统计信息为基础的。关于统计信息,我可以看到前面的一篇博文,内容是统计对SQL Server中查询的影响。

聚合操作(聚合)

聚合函数使聚合操作。一个聚集函数是一个总结的一组数据为1的数据在一定准则的过程,或聚集成基于规则的多数据。一些聚合函数,如平均值,总和,最小,和不同的关键词,可能会导致两种聚合操作:流聚合(流聚集)和Hashi聚集(哈希聚合)。

流聚合(流聚合)

流聚合需要在汇总的数据集是有序执行聚合函数,数据可以通过命令排序的实现方案,也可以直接从聚集或直接访问有序数据,在另外的非聚集索引,没有聚合操作组是标量聚合,这种操作是执行聚合流量。

例如,我们直接进行标量聚合,如图7所示。



图7。流聚合

但对于集团的条款,因为数据需要根据命令由集团列排序是需要保证排序。注意,排序操作是一个操作,占用内存占用tempdb时记忆insufficient.sql服务器总是选择在排序操作成本最低和散列匹配。手术需要排序,如图8所示。



图8。需要排序的流聚合

排序操作图8按产品线分类,然后将它们按照各自的群体聚集。

散列聚合(散列聚合)

上面的流量聚集是适合相对少量的数据,但对于一个相对较大的表,使用哈希组低于排序的成本。散列集建立内存中的哈希表实现聚集,所以没有需要的数据在内存中建立哈希排序。表以柱后面组作为核心价值,如图9所示。

图9。哈希聚合

在记忆的一个好的哈希表,按照以下的值作为密钥的组,然后处理每一个数据集,当钥匙不在哈希表中存在,将条目添加到哈希表,当钥匙已经存在于哈希表,按照规则(规则聚合函数,如和AVG,是计算值的哈希表)(价值)。

连接(连接)

当多表连接(书签查找和索引连接计数)时,SQL Server将采用三种不同的连接方式:循环嵌套连接(嵌套循环连接)、合并连接(合并连接)和散列连接(散列连接),这些连接不比其他连接好,但每种连接都适应特定场景。

循环嵌套连接(嵌套循环连接)

从图10中可以看到一个简单的循环嵌套连接。



图10。循环嵌套连接的一个示例

循环的嵌套连接的图标也很生动,在外部输入(外部输入)以上,这是索引扫描聚集。在接下来的内部输入(内输入),这里是聚集索引查找。外部输入仅执行一次,与内部输入抬头每一行的加入条件基于外部输入。既然是290线,内部输入执行了290次。

可以通过属性窗口看到它。如图11所示:



图11中执行内部输入的次数。

根据嵌套循环的原理,很容易看出,由于外部输入是扫描的,所以内部输入是查找的。当两个连接的外部输入结果集相对较小,而内部输入表查找非常大时,查询优化器更倾向于选择循环嵌套模式。

合并连接(合并连接)

与循环嵌套不同,合并的连接仅是每个表的一个访问。从这个角度来看,组合连接要比循环嵌套快得多。典型的合并连接如下所示,如图12所示。



图12。合并连接

不难想象组合连接的原理。首先,连接的组合需要双方的顺序。由于输入条件是有序的,所以每个输入集都取一行来比较,等回报和不等放弃。从这里,也不难看出为什么合并联接只允许联接等于数字。我们可以从图11中的图标看到这个原理。

如果输入数据的两个方面发生故障,查询分析器将不选择合并连接。我们还可以对提示符进行索引,以强制合并连接。为了实现这一目标,执行计划必须添加一个排序步骤来实现订单,如图13所示。



图13。通过排序实现合并连接

散列连接(哈希连接)

哈希连接只需要1的数据从双方。哈希连接是通过在内存中建立一个哈希表实现。这是更大的内存消耗,如果内存不够,它将占用tempdb。但它不需要有序的组合作为一个典型的哈希连接的连接。如图14所示。



图14。哈希连接

在这里我删除客户的聚集索引,否则两命令输入SQL Server会选择较低的cost.sql服务器组合连接使用两个以上的输入来生成一个哈希表,这是由下面的输入检测,可以在属性窗口中看到,如图15所示。



图15。散列密钥生成和散列密钥检测



一般来说,当两个输入数据较大且数据在数据的一个或两个方面到达时,散列匹配被使用。

并行

当多个表连接时,SQL Server也允许在多CPU或多核情况下查询并行,这无疑提高了效率。图16显示了一个并行的例子。



图16。并行增强效率

总结

本文简要介绍了SQL Server执行计划中常用的操作原理,了解这些步骤和原则是优化查询的基础工作。