2010-03-15 70 views
3

最近,我试图优化这个查询SQL SERVER 2008联接提示

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

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

所以我打算将LOOP提示应用到我的所有查询中,直到审慎情况变得更好。经过一些Google搜索之后,我意识到JOIN提示在BOL中并没有很好涵盖。因此...

  1. 有人可以告诉我为什么对所有查询应用LOOP提示是一个坏主意。我在某处读取LOOP JOIN是查询优化器的默认JOIN方法,但无法验证语句的有效性?
  2. 何时使用JOIN提示?当sh * t击中球迷并且鬼城不在城里时?
  3. LOOP,HASH和MERGE提示有什么区别? BOL指出MERGE似乎是最慢的,但每个提示的应用是什么?

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

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

+0

在研究之前,您的索引和统计信息是否最新? – Paddy 2010-03-15 12:25:11

+0

是的,他们是最新的 – super9 2010-03-15 12:46:36

回答

10

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

因为这会抢占优化者机会来考虑其他可以更高效的方法。

何时使用JOIN提示?当sh * t击中球迷并且鬼城不在城里时?

当数据分布(优化程序在其上进行决策时)严重偏斜并且统计信息无法正确表示。

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

这些是不同的算法。

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

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

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

+0

很好的解释!我不认为你可以给你2美分马丁的答复? – super9 2010-03-15 12:52:21

2

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

这是否意味着您提出的计划会变得更糟?假设表更新需要一个固定的时间,它现在被索引活动计算出来了。

+0

这是一个公平的假设吗?我一直认为,索引寻求的大部分工作是要走的路。 – super9 2010-03-15 12:49:15

+0

我认为这是一个公平的假设,尽管如果我错了,我很乐意纠正。 Analytics.UserGUID上是否有聚集索引?如果是这样更新GUID到一个不同的值可能会导致一个公平的IO,这可能解释您遇到的任何性能问题。 – 2010-03-15 13:07:25

+0

我在Analytics.UserGUID上有一个非聚集索引。我正在更新UserID列而不是UserGUID。我在Analytics.UserID列上没有索引。 – super9 2010-03-15 13:11:41