sql - 为什么 'HASH JOIN' 或 'LOOP JOIN' 改进了这个存储过程?

标签 sql sql-server sql-server-2005 optimization join

我有一个基本查询,只需从 LEFT JOIN 更改一个连接即可从 6 秒变为 1 秒。至 LEFT HASH JOIN或“左循环加入”。谁能解释为什么这会导致性能如此大的提高,以及为什么 SQL 的优化器不能自己解决这个问题?

SQL 大致如下所示:

SELECT
   a.[ID]
FROM
   [TableA] a
LEFT HASH JOIN
   [TableB] b
   ON b.[ID] = a.[TableB_ID]
JOIN
   [TableC] c
   ON c.[ID] = a.[TableC_ID]
WHERE
   a.[SomeDate] IS NULL AND
   a.[SomeStatus] IN ('X', 'Y', 'Z') AND
   c.[SomethingElse] = 'ABC'

表 A 和 B 在所有 ID 字段上都有数百万条记录和索引。使用 SQL Server 2005。

编辑:一位同事建议使用 LEFT LOOP JOIN,它似乎使它变得更快...... SQL 不是我的强项之一,所以我试图了解这些“提示”是如何提供帮助的。

最佳答案

HASH JOIN当大百分比的行对结果集有贡献时很有用。

在你的情况下,建立一个 HASH TABLE在任一 AB扫描另一个表比执行 NESTED LOOPS 更便宜上指数B.ID或者合并优化器在提示之前使用的排序结果集。
SQL Server的优化器没有看到:可能是因为您没有收集统计​​信息,可能是因为您的数据分布有偏差。

更新:

既然你提到了 LOOP JOIN提高了速度,可能是这样JOIN优化器错误地选择了顺序。

关于sql - 为什么 'HASH JOIN' 或 'LOOP JOIN' 改进了这个存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395582/

相关文章:

python - 如何使用 FreeTDS ODBC 连接到 SQL Server

sql-server - 为什么 MyGeneration 存储过程生成器模板不起作用?

sql - 关于查询执行的问题

sql-server - 如何获取以下场景的 CSV 值

sql - 根据另一个表从一个表中删除

sql - View 和SELECT查询之间的区别

mysql - 遍历 SQL 表,对满足条件的每一行执行查询

sql - 使用 SQL Server 2005 XML API 规范化 XML 片段

c# - ASP/VB/C# .NET 动态计算和引用

mysql - 用另一行更新数据库行(Mysql)