Kyl*_*ndt 42 sql-server execution-plan sql-server-2008-r2
我开始学习执行计划,并且对哈希匹配的工作原理以及为什么在简单连接中使用它感到困惑:
select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)
Run Code Online (Sandbox Code Playgroud)

据我了解,顶部索引扫描的结果变为可散列的,底部索引聚集扫描中的每一行都被查找。我至少在某种程度上了解哈希表是如何工作的,但我对在这样的示例中究竟哪些值进行了哈希处理感到困惑。
我认为它们之间的公共字段,即 id 被散列是有意义的——但如果是这种情况,为什么要散列一个数字?
gbn*_*gbn 32
作为 SQLRockstar 的回答引用
最适合大的、未排序的输入。
现在,
这是 2 个无序输入。
我会考虑在 OwnerUserId 上的 Posts 表上建立一个索引,包括 Title。这将在输入的一侧添加一些顺序到 JOIN + 它将覆盖索引
CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)
Run Code Online (Sandbox Code Playgroud)
然后您可能会发现 Users.DisplayName 索引不会被使用,而是会扫描 PK。
SQL*_*tar 14
来自http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/
“散列连接是成本较高的连接操作之一,因为它需要创建一个散列表来进行连接。也就是说,它是最适合大型未排序输入的连接。它是所有连接中内存最密集的的连接
散列连接首先读取其中一个输入并对连接列进行散列,然后将生成的散列和列值放入内存中构建的散列表中。然后它读取第二个输入中的所有行,对它们进行散列,并检查结果散列桶中的行是否有连接行。”
这篇文章的链接:
http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx
HTH
对数字字段进行散列的优点是您可以获取更大的值并将其分解为更小的部分,以便它可以放入散列表中。
以下是格兰特弗里奇的描述:
“另一方面,哈希表是一种数据结构,它将所有元素划分为相同大小的类别或桶,以允许快速访问元素。哈希函数确定元素进入哪个桶。例如,你可以从表中取出一行,将它散列成一个散列值,然后将散列值存储到一个散列表中。”
您还可以从以下文章的链接中免费获得他的电子书“剖析 SQL Server 执行计划”:
来源:http : //www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/