通常,什么使SQL查询优化器在嵌套循环和散列连接之间做出决定.
解决方法
如果循环内的条件是可以攻击的,那么嵌套的LOOPS是好的,即索引可以用来限制记录的数量.
对于这样的查询:
SELECT * FROM a JOIN b ON b.b1 = a.a1 WHERE a.a2 = @myvar
,有一个领先的,将从a中取出每条记录,并找到b中的所有相应记录.
如果b.b1被索引并具有高基数,则NESTED LOOP将是首选方式.
在sql Server中,它也是执行非等同连接的唯一方法(在ON子句中除了= condition之外)
如果应该解析所有(或几乎所有)记录,则HASH JOIN是最快的方法.
它从b获取所有记录,在它们上构建一个哈希表,然后从a获取所有记录,并使用join列的值作为查找哈希表的键.
> NESTED LOOPS需要这段时间:
Na *(Nb / C)* R,
其中Na和Nb是a和b中的记录数,C是索引基数,R是行查找所需的常量时间(1是SELECT,WHERE和ORDER BY子句中的所有字段都被索引覆盖,关于如果他们不是10)
> HASH JOIN需要这段时间:
Na(Nb * H)
,其中H是构建和查找哈希表(每条记录)所需的常量之和.它们被编程到发动机中.