3

最近,我试图优化这个查询

UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z 
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID

估计的执行计划显示 57% 的表更新和 40% 的哈希匹配(聚合)。我做了一些窥探,并遇到了 JOIN 提示的主题。所以我在我的内部连接和 WA-ZHAM 中添加了一个 LOOP 提示!新的执行计划显示 38% 的表更新和 58% 的索引搜索。

所以我正要开始对我的所有查询应用 LOOP 提示,直到我变得更加谨慎。经过一番谷歌搜索,我意识到 JOIN 提示并没有很好地涵盖在BOL中。所以...

  1. 有人可以告诉我为什么将 LOOP 提示应用于我的所有查询是一个坏主意。我在某处读到 LOOP JOIN 是查询优化器的默认 JOIN 方法,但无法验证语句的有效性?
  2. 何时使用 JOIN 提示?当狗屎打到粉丝和幽灵克星不在城里?
  3. LOOP、HASH 和 MERGE 提示有什么区别?BOL 指出 MERGE 似乎是最慢的,但是每个提示的应用是什么?

感谢您的时间和帮助人们!

我正在运行 SQL Server 2008 顺便说一句。上面提到的统计数据是估计的执行计划。

4

2 回答 2

10

有人可以告诉我为什么将 LOOP 提示应用于我的所有查询是一个坏主意。我在某处读到 LOOP JOIN 是查询优化器的默认 JOIN 方法,但无法验证语句的有效性?

因为这剥夺了优化器考虑其他更有效方法的机会。

何时使用 JOIN 提示?当狗屎打到粉丝和幽灵克星不在城里?

当数据分布(优化器在其上做出决定)严重倾斜并且统计数据无法正确表示它时。

LOOP、HASH 和 MERGE 提示有什么区别?BOL 指出 MERGE 似乎是最慢的,但是每个提示的应用是什么?

这些是不同的算法。

  1. LOOP是嵌套循环:对于外部表中的每条记录,都在内部表中搜索匹配项(使用可用的索引)。当两个表中只有一小部分记录满足JOINWHERE条件时最快。

  2. MERGEsorts 两个表都按排序顺序遍历它们,跳过不匹配的记录。FULL JOINs 和两个记录集都已排序(来自先前的排序操作或使用索引访问路径时)的最快

  3. HASH从其中一个表中在临时存储(内存或)中构建一个哈希表,并tempdb从另一个表中搜索每条记录。如果任一表中的大部分记录与WHEREandJOIN条件匹配,则速度最快。

于 2010-03-15T12:18:25.443 回答
2

估计的执行计划在表更新上显示 57%,在哈希匹配(聚合)上显示 40%。我做了一些窥探,并遇到了 JOIN 提示的主题。所以我在我的内部连接和 WA-ZHAM 中添加了一个 LOOP 提示!新的执行计划显示 38% 的表更新和 58% 的索引搜索。

当然这意味着你提出的计划更糟?假设表更新需要一个恒定的时间,它现在被索引活动所花费。

于 2010-03-15T12:22:26.323 回答