执行计划基础-哈希匹配混乱


39

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

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

在此处输入图片说明

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

对我来说有意义的是,它们之间的公共字段id被散列了-但是,如果是这种情况,为什么还要散列一个数字呢?

Answers:


29

作为SQLRockstar的答案引用

最适合大型,未分类的输入。

现在,

  • 从Users.DisplayName索引扫描(假定为非聚集)中,您获得Users.Id(假定为聚集)=未排序
  • 您还正在扫描帖子中的OwnerUserId = unsorted

这是2个无序输入。

我会考虑OwnerUserId上Posts表上的索引,包括Title。这将在输入的一侧添加一些顺序到JOIN +它将覆盖索引

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

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


1
好的,现在我知道了,我在想Users.DisplayName已由PK排序,事实并非如此。现在对我来说,使用Hash更加有意义。谢谢!
凯尔·勃兰特

1
您也可以尝试使用OPTION (FAST n)提示,其中n是您期望的大致行数。这将使优化器偏向嵌套循环,而不是在n为低时进行哈希联接。原因是散列连接对于大型连接来说速度很快,但是启动成本很高。嵌套循环每行昂贵,但是可以很便宜地开始。因此,这是根据实际数据和访问模式进行微调的问题。
Gaius

1
@Gaius:就个人而言,我希望有索引而不是提示。提示仅在您添加查询时才有用。提示随着时间的流逝成为一种责任。索引往往有用得多。
gbn

1
这不是一个非此即彼的主张:-)
Gaius

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

高温超导


因此,如果仅仅是id字段,我想我不了解散列id字段的优势吗?
凯尔·勃兰特

+1指向Craig Freedman博客的链接,还有更多可用的加入文章:blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff

9

对数字字段进行哈希处理的好处是,您可以采用更大的值并将其分解为较小的部分,以便可以将其放入哈希表中。

这是Grant Fritchey的描述方式:

“另一方面,哈希表是一种数据结构,它将所有元素划分为大小相等的类别或存储桶,以允许快速访问元素。哈希函数确定元素进入哪个存储桶。例如,您可以从表中获取一行,将其哈希成哈希值,然后将哈希值存储到哈希表中。”

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

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


关于JOINS的另一个有趣的文章系列: sql-server-performance.com/articles/dba/…–
Jeff

我通过剖析SQL Server执行计划来工作-太好了!但我在这一点上有些困惑:-P
凯尔·布​​兰特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.