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

只需将一个连接从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不是我的优势之一,所以我试图理解这些“暗示”是如何帮助的.

解决方法

当大部分行对结果集有贡献时,HASH JOIN非常有用.

在您的情况下,在A或B上构建HASH TABLE并扫描另一个表比在B.ID上对索引执行nesTED LOOPS或合并优化程序在提示之前使用的排序结果集要便宜.

sql Server的优化器没有看到:可能是因为您没有收集统计​​信息,可能是因为您的数据分布有偏差.

更新:

由于您提到LOOP JOIN提高了速度,因此优化程序可能错误地选择了JOIN顺序.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...