我开始学习执行计划,并且对哈希匹配的工作原理以及为什么在简单连接中使用它感到困惑:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
据我了解,顶部索引扫描的结果变为可散列,并查找底部索引聚集扫描中的每一行。我至少在某种程度上了解哈希表是如何工作的,但我对在这样的示例中哪些值完全被哈希感到困惑。
对我来说有意义的是它们之间的公共字段 id 被散列 - 但如果是这种情况,为什么要散列一个数字?
正如 SQLRockstar 的回答引用
现在,
这是 2 个无序输入。
我会考虑在 OwnerUserId 上的 Posts 表上建立一个索引,包括 Title。这将在输入的一侧添加一些顺序到 JOIN + 它将覆盖索引
然后您可能会发现不会使用 Users.DisplayName 索引,而是会扫描 PK。
来自http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/
“散列连接是更昂贵的连接操作之一,因为它需要创建一个哈希表来执行连接。也就是说,它是最适合大型、未排序输入的连接。它是所有内存密集型操作中最占用内存的的连接
哈希连接首先读取其中一个输入并对连接列进行哈希处理,然后将生成的哈希和列值放入内存中构建的哈希表中。然后它读取第二个输入中的所有行,对这些行进行哈希处理并检查生成的哈希存储桶中的行以查找连接行。”
链接到这篇文章:
关联
高温高压
散列数字字段的优点是您可以获取更大的值并将其分解为更小的部分,以便它可以放入散列表中。
格兰特弗里奇是这样描述它的:
“另一方面,哈希表是一种数据结构,它将所有元素分成大小相等的类别或存储桶,以允许快速访问元素。哈希函数确定元素进入哪个存储桶。例如,您可以从表中取出一行,将其散列成散列值,然后将散列值存储到散列表中。”
您还可以从以下文章的链接中免费获得他的电子书“剖析 SQL Server 执行计划”:
资料来源:http ://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/