Qua*_*noi 16
NESTED LOOPS如果循环内的条件是可搜索的,那么索引可以用来限制记录的数量.
对于这样的查询:
SELECT *
FROM a
JOIN b
ON b.b1 = a.a1
WHERE a.a2 = @myvar
Run Code Online (Sandbox Code Playgroud)
带有a前导,a将记录每条记录,并找到所有相应的记录b.
如果b.b1被索引并且具有高基数,那么NESTED LOOP将是首选方式.
在SQL Server,它也是执行非等值连接的唯一方法(除了=条款中的条件之外ON)
HASH JOIN 如果应该解析所有(或几乎所有)记录,这是最快的方法.
它接受所有记录b,在它们上构建一个哈希表,然后从中获取所有记录,a并使用连接列的值作为查找哈希表的键.
NESTED LOOPS 需要这个时间:
Na * (Nb / C) * R,
其中Na和Nb是的记录数是a和b,C是索引基数,并且R是行查找所需的常量时间(1所有字段都在SELECT,WHERE并且ORDER BY子句由索引覆盖,10如果它们不是)
HASH JOIN 需要这个时间:
Na + (Nb * H)
,其中H是构建和查找哈希表(每个记录)所需的常量之和.它们被编程到发动机中.
SQL Server 使用表统计计算基数,计算并比较这两个值并选择最佳计划.