哈希键探针和残差


21

说,我们有这样的查询:

select a.*,b.*
from 
a join b
on a.col1=b.col1
and len(a.col1)=10

假设以上查询使用哈希联接并具有残差,则探测键为col1,残差为len(a.col1)=10

但是,通过另一个示例,我可以看到探针和残差在同一列。以下是我要说的话的详细说明:

查询:

select *
from T1 join T2 on T1.a = T2.a 

执行计划,突出显示探针和残差:

在此处输入图片说明

测试数据:

create table T1 (a int, b int, x char(200))
create table T2 (a int, b int, x char(200))

set nocount on
declare @i int
set @i = 0
while @i < 1000
  begin
      insert T1 values (@i * 2, @i * 5, @i)
    set @i = @i + 1
  end

declare @i int
set @i = 0
while @i < 10000
  begin
    insert T2 values (@i * 3, @i * 7, @i)
    set @i = @i + 1
  end

题:

探针和残基如何成为同一列?为什么SQL Server不能仅使用探测列?为什么必须使用同一列作为残差来再次过滤行?

测试数据参考:

Answers:


22

如果联接位于键入为tinyintsmallintinteger* 的单列上,并且如果两列都被约束为NOT NULL,则哈希函数为“ perfect”(完美),这意味着没有哈希冲突的机会,并且查询处理器不必检查再次输入值以确保它们真正匹配。

否则,您将看到一个残差,因为测试哈希桶中的项目是否匹配,而不仅仅是哈希函数匹配。

您的测试未指定列NULL或未指定NOT NULL列(顺便说一句,这是一种不好的做法),因此您似乎使用的数据库NULL是默认数据库。

有关更多信息,请参见Dmitry Pilugin的“ 联接性能,隐式转换以及残差哈希联接执行内部”一文。


*其他限定类型为bitsmalldatetimesmallmoney(var)char(n)(n = 1)和二进制排序规则

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.