SQL Server执行计划详细介绍(三)

前面的SQL Server执行计划详细介绍(一)和SQL Server执行计划详细介绍(二)中我们介绍了SQL Server执行计划中的数据访问操作、书签查询以及聚合,本章节我们来介绍平时遇到得最多的join操作。

总的来说,我们会介绍三种join操作,分别是Nested Loops JoinMerge Join以及Hash Join,它们三者并没有绝对的谁好谁坏,只能说在不同的情况下有不同的join类型更适合。

Nested Loops Join

我们先来看一个Nested Loops Join的例子:

这里我们可以看到Nested Loops Join有两个输入,一个在上面,一个在下面。我们把在上面的称之为Outer Input,把在下面的称之为Inner Input。在真正执行的时候,Outer Input只会执行一次,而Inner Input则会执行Inner Input中的行数的次数,也就是说如果outer Input中有10行,我们就会执行Inner Input十次,就是会遍历Outer Input中的所有record

在这个例子中我们可以看到上面的salesPersonindex seekNumber Of Executions1,就是只执行了一次,而它的record数目就是Actual Number Of Batches17,从而在下面的Employeeclustered index seekNumber of Executions就是上面的record数目,也就是执行了17次。

假如我们加一些过滤让上面的结果record变得少一点,那下面的也就会少执行几次:

我们可以点击看看对应的property,这是上面的record只有3,这样下面的执行次数也就只有3了。具体的数值这里我就不截图了。

从我们上面的解释不难看出,假如我们outter input的数目比较少,而下面的inner input又在joinkey上有index的情况下,Nested Loops Join会是一个很好的选择。

Merge Join

下面我们来看一个Merge Join的例子:

Nested Loops Join不同的是,Merge Join的两个输入都只执行一次,这一点大家可以通过查看对应的属性来确认,另外一个不同就是join的操作需要时一个相等的操作,我们这个例子里是SalesOrderId,并且他们的输入必须是join predicate有序的,我们这里可以看到都是indexscan而且都是salesorderid

正是因为这个在join join predicatte上有序,所以在merge join的时候,我们只要同时从输入拿出一行进行比较,如果相等,我们就返回,如果不等,我们就把值小的那一行拿去除掉,因为他们是有序排列的,所以肯定不会再有一行和值小的这一行匹配了。当其中一个遍历完成之后,我们就结束了,哪怕另外一个还有很多行,也没有必要再去check了。

从这个角度来看,merge join的最大复杂度就是两个输入的和。

假如我们输入的两个列在join predicate上不是有序的,我们大概率不会选择merge join,如下所示:

可以看到customer这个表通过customeridindex scan之后并没有在storeid上有序,所以他会倾向于直接使用别的join方式。假如这时我们强制使用merge join,如下所示:

我们可以看到,为了用merge join,在下面的customer表会进行一次sort,也就是排序,然后才会继续进行merge join的操作。

所以,总的来说,当输入的表格中等或者比较大的时候,并且joind的操作是相等操作,而且他们在joinpredicate上是有序的,我们才会使用merge join

Hash Join

第三种join的方式就是hash join,我们还是首先来看一个例子:

merge join其实是很类似的,它也需要join的操作是相等,并且他们两个输入也都只执行一次,唯一不同的地方在于他不需要输入是在join predicate上有序的,所以hash join会在memory中创建一个hash table(当然假如memory不够,就会放到磁盘上了,在磁盘上创建一个tempdb),一把来说我们会使用两个inputrecord少的一方来进行build hash table。这个record上的一方就是在执行计划中位于上面的一个输入。然后会遍历record多的输入,去检查hash表,看是否在hash表中存在,若是存在就直接返回。

一般来说,hash join会用在两个输入都很大的情况下,当然join的操作还是需要时相等才行。我们总是会遍历两个输入,所以总的复杂度就是两个输入之和了。

至此,我们关于执行计划的介绍就告一段落了。若是有不正确的地方,欢迎大家批评指正。


转载请注明出处:http://www.softlifelogging.com/?p=196&preview=true

更多精彩内容,敬请关注微信公众号: 随手记生活

No Comments

Leave a Reply

Your email address will not be published.