SQL Server执行计划那些事儿(1)——哈希、合并、嵌套联接的选择

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混)。当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下。

开门见山,直接入题

在进行Join的时候,数据库优化器是怎么进行联接呢?下面我们也详细的讲述。

在SQL Server中,有3中Join的策略——哈希匹配(Hash)、合并(Merge)、嵌套循环(Nested Loop).

在理解者三种联接策略之前,我们先来简单了解下哈希匹配联接、合并联接、嵌套循环联接,

哈希匹配联接:这种联接有两种输入,即建立输入和探测输入。首先SQL Server会根据统计信息从两张表中筛选出较小的表作为建立输入,并且读入所有行,然后在内存中根据关联条件建立一个哈希表。在整个建立阶段完成之后就进入探测阶段。以后一行一行的对探测输入进行扫描和计算,并为每个探测行计算哈希值,然后进行匹配(当然这里也分多种情况,建立输入大于可用内存时等其他情况)。

合并联接:合并连接要求两个输入都要在合并列上排序。由于每个输入都已排序,因此Merge Join运算符将从每个输入中获取一行进行比较,如果行相等则进行返回,不等则舍弃。当数据量不大的时候,这种联接方式比哈希匹配更加有效。

嵌套循环联接:嵌套循环也称“嵌套迭代”,他将一个联接输入用作外部输入表,将另一个联接输入用作内部输入表。外部循环逐行处理外部输入表。内部循环逐行处理外部输入表,内部循环会针对每个外部行执行,在内部输入表中搜索匹配的行。

通过上面的介绍,我们也能分析出来(可以根据时间复杂度,和空间复杂度),以上三种联接并没有绝对的优劣。

大致可以分一下几种情况:

(1)当数据量容量很大,且未排序的情况下,哈希匹配要优于其他两种。

(2)当属数据已经排序,且数据量不大的之后,合并连接更加有效。

(3)当结果集比较小,且数据容量不大的时候嵌套循环比较合适。

下面我们可以通过测试来查看SQL Server优化器的选择。

我们先创建两张表(Headers和Details):

1.执行下面查询,查看执行计划:

select *

from Headers

inner join Details on Headers.ID=Details.HeaderID

go

2.查看执行计划,可以看出查询优化器使用了哈希匹配:

3.在两表中创建聚集索引

create nonclustered index index_details_headerID on details(headerID)

create unique clustered index index_details_ID_headerID on details(headerID,ID)

4、执行上面查询,开启执行计划,可以看出此时优化器使用了合并联接

5.现在执行下面查询语句(带where 过滤):

select *from Headers inner join Details on Headers.ID=Details.HeaderID where Details.ID=500

6.通过查看执行计划得出,当结果集比较小的时候优化器选择了嵌套循环:

总结

通过上面的我们可以得出,三种联接各有优略,视乎情况而定。但是如果可以的话,应该在关联列上建立索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server执行计划是一个非常有用的工具,可以帮助你优化查询语句,提高数据库性能。执行计划是一个查询计划,它由SQL Server使用来执行查询语句的最佳方式。 执行计划中包含了查询语句的各个部分,包括表的访问方式、索引的使用情况、连接方式、排序方式等等。通过查看执行计划,可以了解查询语句在数据库中的执行情况,找到可能存在的瓶颈并进行优化。 以下是一些常见的执行计划中的术语及其含义: 1. 聚合操作:包括聚合函数(如SUM、AVG等)或GROUP BY语句。 2. 连接操作:指查询中的JOIN操作,包括内连接、左连接、右连接、全连接等。 3. 分配操作:指将数据分配到不同的物理位置,包括分组操作和排序操作。 4. 过滤操作:指WHERE子句中的条件,过滤出满足条件的数据。 5. 索引扫描:指使用索引进行数据访问的方式。 6. 表扫描:指直接对整个表进行扫描的方式。 7. 聚合操作的排序:指对聚合操作的结果进行排序的方式。 8. 连接操作的方式:包括嵌套循环连接、哈希连接和排序合并连接等。 9. 查询的成本:指SQL Server估算的查询成本,用于比较不同查询方案的效率。 要解读执行计划,可以使用SQL Server Management Studio中的图形化工具,或者使用T-SQL命令分析工具。在查询分析器中,可以使用SET SHOWPLAN_ALL和SET SHOWPLAN_TEXT命令来生成执行计划。 需要注意的是,执行计划并不是绝对准确的,它只是SQL Server估算的最佳执行计划。在实际应用过程中,可能存在其他因素影响查询性能,如硬件配置、网络延迟等。因此,在进行性能优化时,需要综合考虑多个方面的因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值