SQL SERVER 2008 JOIN提示

时间:2010-03-15 12:12:28

标签: sql-server-2008 tsql join join-hints

最近,我试图优化此查询

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提示,直到谨慎使我变得更好。经过一些谷歌搜索,我意识到BOL中没有很好地涵盖JOIN提示。因此...

  1. 有人可以告诉我为什么在我的所有查询中应用LOOP提示是个坏主意。我在某处读到LOOP JOIN是查询优化器的默认JOIN方法,但无法验证语句的有效性?
  2. 何时使用JOIN提示?当sh * t击中风扇并且幽灵破坏者不在城里?
  3. LOOP,HASH和MERGE提示之间的区别是什么? BOL声称MERGE似乎是最慢的,但每个提示的应用是什么?
  4. 感谢您的时间和帮助人们!

    我正在运行SQL Server 2008 BTW。上面提到的统计数据是ESTIMATED执行计划。

2 个答案:

答案 0 :(得分:10)

  

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

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

  

何时使用JOIN提示?当sh * t击中风扇并且幽灵破坏者不在城里?

当数据分布(优化程序做出决策时)严重偏差,统计数据无法正确表示。

  

LOOP,HASH和MERGE提示之间的区别是什么? BOL声称MERGE似乎是最慢的,但每个提示的应用是什么?

这些是不同的算法。

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

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

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

答案 1 :(得分:2)

  

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

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