SQL Server DBA面试知识点(六)-- 表join

两表join是一类比较低效的数据操作,因此SQL Server会应用不同的join策略,目的是提高join性能。如果是多表join,则必定先两两join,一步步得到最终结果。
SQL Server使用基于性能的优化,自动选择最优的join策略。但我们也可以使用query hint查询提示,指定我们希望使用的join方式。

SQL Server中的join策略为:
LOOP | HASH | MERGE | REMOTE

nested loop join: 当一个表很小,另一个表很大时,一般使用loop join。运行过程是基于小表中的每一行,在大表中搜索对应的匹配行。例如:
表A共100行,表B共1000万行。loop join则用表A中的数据一条一条去表B中找匹配的行。100次查找即可完成查询。

merge join: 当两个表都很大,但是关联字段已经经过排序了。运行过程是比较两个input数据集的头,如果相等就输出,如果不相等就丢弃值低的那个。这个和数据结构中,merge sort是一样的。例如:
TableA join TableB on TableA.id = TableB.id …
如果两表的id字段正好是聚集索引,也就是说id字段已经排序过了,此时就会使用merge join。另外由于子查询等等原因也都可能使字段已经是隐含有序了。

Hash join: 适用于较大的表,未排序且没有索引的键值的join。由于没有其他提高效率的方法,才退而求其次使用Hash join,因此hash join性能较差。
学过数据结构的同学应该知道,hash join最大的问题是,join前需要计算出所有join key的hash值。最大的优点是一旦有了hash值,查询特定值的时间是常量。Hash join通常是效率最差的join方式,但对于一类特殊情况则是不错的选择:
当表很大且join字段为长字符时,通常即使建立了索引,join的效率也会比较低。此时可在表中新增一个字段,用于存储事先计算好的join字段的hash值。此时就可直接使用hash字段做join,从而提高了效率。该解决方案的限制是,如果join字段值经常发生变化,则需要频繁更新hash字段中的hash值,从而导致效率低下。
Hash join use in all set-matching operations, and distinct group operations. 另外hash join还分3种方式,本文不细述。

Remote join: remote join适用于参与join的两个表一个在本地,另一个在远程的情况。我们在使用linked server时常常遇到这种情况。

请参考:
http://msdn.microsoft.com/en-us/library/ms173815.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值