我只需将一个连接从LEFT JOIN
更改为LEFT HASH JOIN
或“LEFT LOOP JOIN”,即可获得从6秒到1秒的基本查询。任何人都可以解释为什么这会导致性能如此大幅度增加以及为什么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不是我的优势之一,所以我试图理解这些“提示”是怎样的帮助
答案 0 :(得分:7)
HASH JOIN
非常有用。
在您的情况下,在HASH TABLE
或A
上构建B
并扫描另一个表比在NESTED LOOPS
上对索引执行B.ID
便宜或者合并优化程序在提示之前使用的排序结果集。
SQL Server
的优化器没有看到:可能是因为您没有收集统计信息,可能是因为您的数据分布有偏差。
<强>更新强>
由于您提到LOOP JOIN
提高了速度,因此优化程序可能错误地选择了JOIN
订单。