何时尝试哈希提示,如何:
- 在检查至少一个表上存在足够的索引之后。
- 在尝试重新安排查询之后。诸如将连接转换为“in”或“exists”、更改连接顺序(无论如何这只是一个提示)、将逻辑从 where 子句移动到连接条件等。
关于哈希连接何时有效的一些基本规则是连接条件不作为表索引存在以及表大小不同时。如果您正在寻找技术描述,那么有一些关于哈希连接如何工作的很好的描述。
为什么要使用任何连接提示(具有强制顺序副作用的哈希/合并/循环)?
- 为了避免极端情况的执行速度极慢(.5 -> 10.0s)。
- 当优化器始终选择一个平庸的计划时。
提供的提示在某些情况下可能并不理想,但提供了更一致的可预测运行时。使用提示时,应预先测试预期的最坏情况和最佳情况。可预测的运行时间对于 Web 服务至关重要,例如,严格优化的标称 [.3s, .6s] 查询优于范围 [.25, 10.0s] 的查询。随着统计数据的最新更新和最佳实践的遵循,可能会发生较大的运行时差异。
在开发环境中进行测试时,还应关闭“作弊”以避免热/冷运行时差异。从另一个帖子...
CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache
最后一个选项可能与 option(recompile) 提示相同。
机器的 MAXDOP 和加载也会在运行时产生巨大的差异。将 CTE 物化到临时表中也是一种很好的锁定机制,需要考虑。