我开始学习执行计划,并且对哈希匹配的确切工作原理以及为什么在简单连接中使用它感到困惑:
select Posts.Title,Users.DisplayName From Posts JOIN Users on Posts.OwnerUserId = Users.Id OPTION (MAXDOP 1)
据我所知,Top索引扫描的结果变为哈希能力,并且查找底部索引聚类扫描中的每一行.我理解哈希表至少在某种程度上是如何工作的,但是我很困惑在这样的例子中哪些值正好被哈希处理.
让我有意义的是,他们之间的共同领域,id,是哈希 – 但如果是这样的话,为什么要哈希一个数字呢?
解决方法
正如sqlRockstar的回答引用
best for large,unsorted inputs.
现在,
>从Users.DisplayName索引扫描(假设为非聚集),您获得Users.Id(假设已聚集)=未排序
>您还扫描OwnerUserId =未分类的帖子
这是2个无序输入.
我会在OwnerUserId上的Posts表上考虑一个索引,包括Title.这将在JOIN的输入的一侧添加一些顺序,它将覆盖索引
CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)
然后,您可能会发现不会使用Users.DisplayName索引,而是会扫描PK.