最近,我试图优化此查询
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提示。因此...
感谢您的时间和帮助人们!
我正在运行SQL Server 2008 BTW。上面提到的统计数据是ESTIMATED执行计划。
答案 0 :(得分:10)
有人可以告诉我为什么在我的所有查询中应用LOOP提示是一个坏主意。我在某处读到LOOP JOIN是查询优化器的默认JOIN方法,但无法验证语句的有效性?
因为这剥夺了优化器的机会,可以考虑其他更有效的方法。
何时使用JOIN提示?当sh * t击中风扇并且幽灵破坏者不在城里?
当数据分布(优化程序做出决策时)严重偏差,统计数据无法正确表示。
LOOP,HASH和MERGE提示之间的区别是什么? BOL声称MERGE似乎是最慢的,但每个提示的应用是什么?
这些是不同的算法。
LOOP
是嵌套循环:对于外部表中的每条记录,将搜索内部表以查找匹配项(使用可用索引)。当两个表中只有一小部分记录满足JOIN
和WHERE
条件时,速度最快。
MERGE
排序两个表都按排序顺序遍历它们,跳过不匹配的记录。最快的FULL JOIN
和两个记录集已经排序(从以前的排序操作或使用索引访问路径时)
HASH
在其中一个表的临时存储(内存或tempdb
)中构建一个哈希表,并从另一个表中搜索每个记录。如果来自任一表格的大部分记录与WHERE
和JOIN
条件匹配,则最快。
答案 1 :(得分:2)
预计执行计划显示57% 在表格更新和40%的哈希 匹配(聚合)。我做了一些窥探 围绕并遇到了主题 加入提示。所以我添加了一个LOOP提示 我内心的加入和WA-ZHAM!新的 执行计划显示在表上38% 索引搜索更新和58%。
当然,这意味着您提出的计划更糟糕?假设表更新需要一个恒定的时间,现在它将被索引活动计算出来。