我开始学习执行计划,并对哈希匹配的确切工作方式以及为什么在简单的联接中使用它感到困惑:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

enter image description here

据我了解,顶部索引扫描的结果成为Hash的功能,并且在底部索引群集扫描中的每一行都被查找。我了解哈希表如何至少在某种程度上起作用,但是我对这样的示例中的哪些值完全被哈希感到困惑。

有什么意义是我之间的共同字段,即ID是哈希 - 但是,如果是这样,为什么要有一个数字呢?

有帮助吗?

解决方案

作为sqlrockstar的答案报价

最适合大的未分类输入。

现在,

  • 从users.displayname索引扫描(假定非集群)您获取users.id(假设群集)= unsorted
  • 您还在扫描wolderuserid = unsorted的帖子

这是2个无序输入。

我会考虑在所有owneruserid上的帖子表上的索引,包括标题。这将在输入的一侧添加一些订单,以覆盖索引

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

然后,您可能会发现不使用displayName索引,它将扫描PK。

其他提示

http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

“哈希(Hash Join)是更昂贵的加入操作之一,因为它需要创建哈希表才能进行加入。也就是说,这是最适合大型,未分类的输入的加入。连接

哈希联接首先读取输入之一并哈希连接列,并将结果的哈希和列值放入内存中构建的哈希表中。然后,它读取第二个输入中的所有行,将其放置并检查所得的哈希桶中的行中的行中的行中的行。”

哪个链接到这篇文章:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

Hth

哈希数字字段的优点是,您要占据更大的价值并将其分解为较小的零件,以便将其放入哈希表中。

这是格兰特·弗里奇(Grant Fritchey)描述的方式:

“另一方面,哈希表是一个数据结构,将所有元素分为等于尺寸的类别或存储桶,以便快速访问元素。哈希功能确定元素进入哪个存储桶。例如,您可以从表中划出一排,将其放入哈希值中,然后将哈希值存储到哈希表中。”

您还可以从以下文章中的链接中获取他的电子书“解剖SQL Server执行计划”的免费副本:

资源: http://www.simple-talk.com/sql/performance/graphical-execution-plans-plans-for-simple-sql-queries/

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