是什么让SQL查询优化器在嵌套循环和散列连接之间做出决定

cin*_*ndi 7 sql performance

通常,什么使SQL查询优化器在嵌套循环和散列连接之间做出决定.

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,

    其中NaNb是的记录数是ab,C是索引基数,并且R是行查找所需的常量时间(1所有字段都在SELECT,WHERE并且ORDER BY子句由索引覆盖,10如果它们不是)

  • HASH JOIN 需要这个时间:

    Na + (Nb * H)

    ,其中H是构建和查找哈希表(每个记录)所需的常量之和.它们被编程到发动机中.

SQL Server 使用表统计计算基数,计算并比较这两个值并选择最佳计划.