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

标签 sql performance

一般来说,是什么让 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

    其中 NaNbab 中的记录数,C 是索引基数,R 是行查找所需的常数时间(1SELECT 中的所有字段, WHEREORDER BY 子句被索引覆盖,如果没有,大约 10)

  • HASH JOIN 花费的时间:

    Na + (Nb * H)

    ,其中 H 是构建和查找哈希表(每条记录)所需的常量总和。它们被编程到引擎中。

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

关于sql - 是什么让 SQL 查询优化器在嵌套循环和散列连接之间做出决定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975623/

相关文章:

sql - 从同一个表中具有最早值的表中选择不同的 ID 列表

mysql - 获取包含子项和子项详细信息计数的父项的 MySQL 结果

mysql - SQL 查询替换并选择特定 DIV 之间的所有内容

performance - 函数调用与内联之间的 GLSL 性能差异

javascript - 在javascript中将对象作为参数传递的性能

plugins - jQuery 延迟加载是否有任何真正的性能提升?

python - 图形工具中的顶点坐标

c# - SQL 查询从 BIT 类型列中获取 boolean 值

php - 嵌套选择查询问题

arrays - 普通数组与可分配/指针数组,Fortran 建议?