해시 키 프로브 및 잔차


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에서 프로브 열만 사용할 수없는 이유는 무엇입니까? 행을 다시 필터링하기 위해 잔차와 동일한 열을 사용해야하는 이유는 무엇입니까?

테스트 데이터에 대한 참조 :

답변:


22

가입하면 단일 열 입력에 같은 tinyint, smallint또는 integer* 모두 열이로 제한되는 경우 NOT NULL, 해시 함수는 '완벽한'입니다 - 해시 충돌의 기회가없는 것을 의미하고, 쿼리 프로세서는 체크 할 필요가 없습니다 값이 다시 일치하는지 확인하십시오.

그렇지 않으면 해시 버킷의 항목이 해시 함수 일치뿐만 아니라 일치에 대해 테스트됨에 따라 잔차가 표시됩니다.

테스트에서 NULL또는 NOT NULL열에 대해 지정하지 않았으므로 (잘못된 방법) 데이터베이스 NULL가 기본값 인 데이터베이스를 사용하고있는 것 같습니다 .

내 게시물에 대한 자세한 내용은 Dmitry Pilugin의 성과, 암시 적 변환 및 잔차해시 조인 실행 내부참여하십시오 .


* 다른 한정 유형은 n = 1 및 이진 데이터 정렬의 경우 bit , smalldatetime , smallmoney(var) char (n) 입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.