Sonda klucze mieszające i pozostałe

21

Powiedzmy, że mamy takie zapytanie:

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

Zakładając, że powyższe zapytanie używa łączenia mieszającego i ma wartość resztkową, kluczem sondy będzie, col1a resztą będzie len(a.col1)=10.

Ale przechodząc przez inny przykład, widziałem zarówno sondę, jak i pozostałość, które są tą samą kolumną. Poniżej znajduje się wyjaśnienie tego, co próbuję powiedzieć:

Pytanie:

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

Plan wykonania, z podświetloną sondą i pozostałością:

wprowadź opis zdjęcia tutaj

Dane testowe:

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

Pytanie:

Jak sonda i reszta mogą być tą samą kolumną? Dlaczego SQL Server nie może używać tylko kolumny sondy? Dlaczego musi ponownie używać tej samej kolumny jako reszty, aby ponownie filtrować wiersze?

Referencje dla danych testowych:

TheGameiswar
źródło

Odpowiedzi:

22

Jeśli dołączyć jest pojedynczą kolumną wpisany jako tinyint, smallintlub integer* i jeśli obie kolumny są ograniczane być NOT NULLfunkcja skrótu jest „idealny” - czyli nie ma szans kolizji hash, a procesor kwerend nie trzeba sprawdzić wartości ponownie, aby upewnić się, że naprawdę pasują.

W przeciwnym razie zobaczysz resztkę, ponieważ elementy w segmencie mieszania są testowane pod kątem dopasowania, a nie tylko dopasowania funkcji skrótu.

W teście nie określono NULLani NOT NULLdla kolumn (nawiasem mówiąc, zła praktyka), więc wygląda na to, że używasz bazy danych, w której NULLjest domyślna.

Więcej informacji w moim poście Dołącz wydajność, konwersje niejawne oraz pozostałości i Hash Dołącz Internals Execution przez Dmitrija Pilugin.


* Inne typy kwalifikujące to bit , smalldatetime , smallmoney i (var) char (n) dla n = 1 oraz sortowanie binarne

Paul White mówi GoFundMonica
źródło