T-SQL 查询优化之联接顺序

本文探讨了数据库查询优化中联接顺序的重要性,并通过实例展示了不同联接顺序对查询性能的影响。文章还解释了联接的交换性和相关性属性,以及这些属性如何影响执行计划。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

联接顺序,是查询优化的最复杂问题之一,从七十年代以来,一直是广泛探索的主题。随着联接表的增加,搜索空间的扩大,必然导致计划数量的增大。

联接一次只能包括两个表,因此,N个表联接有 N-1次联接。当然,下一个联接不需要等到上一个联接完成。

两个属性:

1,交换

A JOIN B = B JOIN A

它确定那个表作为第一个表,例如,在 NESTED LOOP JOIN 中,第一个表是作为外部表,第二个是内部表;在 HASH JOIN 中,第一个表作为 BUILD,第二个是 PROBE。

2,相关

(A JOIN B) JOIN C = A JOIN (B JOIN C)

它确定表联接的顺序,例如,等号左边,首先 A JOIN B,然后中间结果再联接 C,而右边是,先 B JOIN C,后结果再联接A。

 

毫无疑问,联接的交换和相关属性,产生了表联接的不同排列,而每个排列的开销是不同的,当然,最终的决定在于查询优化器。

 

好吧,看个例子:

USE AdventureWorks
GO
SELECT FirstName, LastName
FROM Person.Contact AS C 
JOIN Sales.Individual AS I ON C.ContactID = I.ContactID 
JOIN Sales.Customer AS Cu ON I.CustomerID = Cu.CustomerID
WHERE Cu.CustomerType = 'I'


 

从上面执行计划可以看到,表联接并没有按照T-SQL的输入顺序进行,而是,先CUSTOMER AND INDIVIUDAL,后再联接 CONTACT。

执行如下语句:

SELECT FirstName, LastName
FROM Person.Contact AS C 
JOIN Sales.Individual AS I ON C.ContactID = I.ContactID 
JOIN Sales.Customer AS Cu ON I.CustomerID = Cu.CustomerID
WHERE Cu.CustomerType = 'I'
OPTION (FORCE ORDER)


 

这里,我们强制按照T-SQL联接,但是,开销增大了,第一个占总开销的38%,强制的是62%。

 

最后,应当知道,

1,如果是 左深联接,结果是 N!;

2,如果是 树丛联接,结果是 (2N-2)!/(N-1)!。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值