有什么优势,如果任何明确做的散列加入超过一定期参加(其中SQL服务器将决定最好加入战略的)?例如:

select pd.*
from profiledata pd
inner hash join profiledatavalue val on val.profiledataid=pd.id

在简单的代码样本上,我指定参加战略,而如果我离开的"散列"关键词就SQL服务器将做一个合并的加入的幕后(按"实际执行计划")。

有帮助吗?

解决方案

optmiser在日常使用中做得非常好。然而,从理论上讲,可能需要3周时间才能找到完美的计划,因此生成的计划有可能不理想。

除非你有一个非常复杂的查询或大量的数据,否则我就不管它是什么,它根本无法产生一个好的计划。然后我会考虑它。

但随着时间的推移,随着数据的变化/增长或索引的变化等,您的JOIN提示将变得过时并阻止最佳计划。 JOIN提示只能在开发时使用您拥有的那组数据优化该单个查询。

就个人而言,我从未在任何生产代码中指定JOIN提示。

我通常通过更改查询,添加/更改索引或将其分解来解决错误的联接(例如,首先加载临时表)。或者我的查询错误,或者我进行了隐式数据类型转换,或者突出显示了我的架构中的缺陷等。

我见过其他开发人员使用它们,但只有在复杂视图嵌套的情况下才会使用它们,并且在重构时会导致后来的问题。

编辑:

我今天进行了一次转换,一些同事将使用它们强制执行错误的查询计划(使用NOLOCK和MAXDOP 1)来“鼓励”迁移远离其下游系统之一直接调用的传统复杂嵌套视图。

其他提示

当尝试一哈希暗示,如关于:

  • 在检查之后,适当的指数上存在的至少一个 表。
  • 之后试图重新安排的查询。事情就像转换 加入为"中"或"存在",改变加入了(这是唯一一个真的 无论如何暗示),移动的逻辑,从那里条款,以加入的条件,等等。

一些基本规则有关当的散列加入是有效的,是在加入条件并不存在一个表中的索引和当表格的尺寸是不同的。如果你在寻找一个技术说明有一些良好的描述有关如何散列加入的工作。

为什么使用的任何加入提示(哈希/合并/循环侧效力的顺序)?

  • 为了避免极其缓慢的执行(.5->10.0s)的角情况。
  • 当优化始终选择了一个平庸的计划。

一个供给的提示是有可能不适用于一些情况,但提供了更一致的可预测运行时。预期的最糟糕的情况下,最好的情况下,方案应该预测时采用一个提示。可预测的运行时间至关重要的网络服务,那里的刚性地优化的名义[.3s,.6s]查询是优选的一个可能的范围[.25,10.0西]的例子。大运行时间差异可能发生与统计信息刚更新和最佳做法之后。

测试时在发展的环境中,一个应该关闭"欺骗",以及避免热/冷运行时间差异。从另一个 ...

CHECKPOINT -- flushes dirty pages to disk
DBCC DROPCLEANBUFFERS -- clears data cache
DBCC FREEPROCCACHE -- clears execution plan cache

最后的选择可能是相同的,因为该备选办法(重新编译)提示。

MAXDOP和装载机器也可以使一个巨大的差异在运行时间。实现CTE成临时表也是一个很好的锁定机制,并要考虑的事情。

Hash加入并行化和扩展比任何其他连接更好,并且非常适合最大化数据仓库中的吞吐量。

我在运输代码中看到的唯一提示是OPTION(FORCE ORDER)。 SQL查询优化器中的愚蠢错误会生成一个尝试加入未过滤的varchar和唯一标识符的计划。添加FORCE ORDER会导致它首先运行过滤器。

我知道,重载列很糟糕。有时,你必须忍受它。

逻辑计划优化器无法向您保证它找到了最佳解决方案:精确算法太慢而无法在生产服务器中使用;而是使用了一些贪婪的算法。

因此,这些命令背后的基本原理是让用户指定最佳连接策略,如果优化器无法找出最适合采用的方法。

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