一般来说,是什么让 SQL 查询优化器在嵌套循环和散列连接之间做出决定。
最佳答案
NESTED LOOPS
如果循环内的条件是sargable,那就很好,即可以使用索引来限制记录数。
对于这样的查询:
SELECT *
FROM a
JOIN b
ON b.b1 = a.a1
WHERE a.a2 = @myvar
,以 a
开头,将获取 a
中的每条记录,并应找到 b
中的所有相应记录。
如果 b.b1
已建立索引且基数较高,则 NESTED LOOP
将是首选方式。
在 SQL Server
中,它也是执行非等值连接(ON
子句中 =
条件以外的内容)的唯一方法
HASH JOIN
如果所有(或几乎所有)记录都应该被解析,那么 HASH JOIN 是最快的方法。
它从 b
中获取所有记录,在它们之上构建一个哈希表,然后从 a
中获取所有记录,并使用连接列的值作为键来查找查找哈希表。
嵌套循环
需要这个时间:Na * (Nb/C) * R
,其中
Na
和Nb
是a
和b
中的记录数,C
是索引基数,R
是行查找所需的常数时间(1
是SELECT
中的所有字段,WHERE
和ORDER BY
子句被索引覆盖,如果没有,大约10
)HASH JOIN
花费的时间:Na + (Nb * H)
,其中
H
是构建和查找哈希表(每条记录)所需的常量总和。它们被编程到引擎中。
SQL Server
使用表统计信息计算基数,计算并比较两个值并选择最佳计划。
关于sql - 是什么让 SQL 查询优化器在嵌套循环和散列连接之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975623/