代码之家  ›  专栏  ›  技术社区  ›  Kelsey

为什么“散列连接”或“循环连接”会改进此存储过程?

  •  7
  • Kelsey  · 技术社区  · 15 年前

    我有一个基本查询,只需将一个连接从 LEFT JOIN 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字段上都有数百万条记录和索引。使用SQLServer2005。

    一个collegue建议使用左循环连接,这似乎使其速度更快。。。SQL不是我的强项之一,所以我试图理解这些“提示”是如何起作用的。

    1 回复  |  直到 14 年前
        1
  •  7
  •   Joel Coehoorn    15 年前

    HASH JOIN 当很大百分比的行贡献给结果集时,此选项非常有用。

    在您的情况下,构建一个 HASH TABLE 在任何一个 A B 扫描另一张桌子比两张桌子都便宜 NESTED LOOPS 超过 B.ID 或者合并优化器在提示之前使用的排序结果集。

    SQL Server 的优化器没有看到这一点:可能是因为您没有收集统计数据,可能是因为您的数据分布不均匀。

    既然你提到了 LOOP JOIN 提高了速度,可能会使 JOIN