最近,我是想要优化这个查询

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

估计的执行计划显示57%上表更新和40%上散列匹配(Aggregate)。我做了一些四处窥探和遇到的议题的加入的提示。所以我加了一个循环暗示我的内加入和WA-ZHAM!新的执行计划显示了38%上表更新和58%的指数要求。

所以我就开始应用环路的提示我所有的查询,直到谨慎得到了更好的我。之后,一些搜索时,我意识到,加入提示都没有很好地涵盖在 BOL.因此...

  1. 有人可以告诉我为什么申请循环的提示我所有的查询是一个糟糕的想法。我读的地方,一个循环加入是默认加入的方法,用于查询的优化,但不能验证有效性的发言?
  2. 时加入的提示,使用?当sh*t打扇和捉鬼敢死队是不是在城里?
  3. 有什么区别之间的循环,散和合并的提示?BOL国家合并似乎是最慢的,但是,什么是程序的每个提示?

感谢您的时间,并帮助人们!

我SQL服务器2008年顺便说一句.统计数据上述估计的执行计划。

有帮助吗?

解决方案

有人可以告诉我为什么申请循环的提示我所有的查询是一个糟糕的想法。我读的地方,一个循环加入是默认加入的方法,用于查询的优化,但不能验证有效性的发言?

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

时加入的提示,使用?当sh*t打扇和捉鬼敢死队是不是在城里?

在数据分发(其上的优化程序,使其决定)是严重歪曲的和统计数据不能够代表是正确的。

有什么区别之间的循环,散和合并的提示?BOL国家合并似乎是最慢的,但是,什么是程序的每个提示?

这些都是不同的算法。

  1. LOOP 是嵌套循环:每个记录从外表,内表是寻找相匹配(用的索引)。快当只有一小部分的记录,从两个表格中满足 JOINWHERE 条件。

  2. MERGE 各种各样既表是穿过他们在排序,跳过无与伦比的记录。最快的 FULL JOINs和当两个记录已经排序(从先前的排序操作,或者当索引的访问路径是使用)

  3. HASH 建立一个哈希表在临时储存(或存储器 tempdb)从一个表和搜查它每条记录的从另一个。最快的,如果大部分的记录表相匹配的 WHEREJOIN 条件。

其他提示

估计的执行计划显示57% 在本表更新和40%在哈希 匹配(Aggregate)。我做了一些探听 周围和遇到的主题 加入提示。所以我加了一个循环的提示 我的内加入和WA-ZHAM!新的 执行计划显示了38%在桌上 更新和58%的指数要求。

当然,这意味着你的提议的计划是更糟吗?假设表更新需要一定的时间现在正出计算成本的指数活动。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top