我有一个基本查询,只需从 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
在任一 A
或 B
扫描另一个表比执行 NESTED LOOPS
更便宜上指数B.ID
或者合并优化器在提示之前使用的排序结果集。SQL Server
的优化器没有看到:可能是因为您没有收集统计信息,可能是因为您的数据分布有偏差。
更新:
既然你提到了 LOOP JOIN
提高了速度,可能是这样JOIN
优化器错误地选择了顺序。
关于sql - 为什么 'HASH JOIN' 或 'LOOP JOIN' 改进了这个存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395582/