SQL SERVER 2008 JOIN提示

sup*_*er9 3 t-sql join sql-server-2008 join-hints

最近,我试图优化此查询

UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z 
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID
Run Code Online (Sandbox Code Playgroud)

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

所以我即将开始对我的所有问题应用LOOP提示,直到谨慎使我变得更好.经过一些谷歌搜索,我意识到JOIN提示在BOL中没有很好地涵盖.因此...

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

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

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

Qua*_*noi 10

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

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

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

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

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

这些是不同的算法.

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

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

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