Tasti hash sonda e residui


21

Dì, abbiamo una domanda come questa:

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

Supponendo che la query precedente utilizzi un hash join e abbia un residuo, la chiave della sonda sarà col1e il residuo sarà len(a.col1)=10.

Ma mentre faccio un altro esempio, ho potuto vedere sia la sonda che il residuo come la stessa colonna. Di seguito è riportata un'elaborazione di ciò che sto cercando di dire:

Query:

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

Piano di esecuzione, con sonda e residuo evidenziato:

inserisci qui la descrizione dell'immagine

Dati di test:

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

Domanda:

Come può una sonda e un residuo essere la stessa colonna? Perché SQL Server non può utilizzare solo la colonna probe? Perché deve utilizzare la stessa colonna di un residuo per filtrare nuovamente le righe?

Riferimenti per dati di test:

Risposte:


22

Se il join si trova su una singola colonna digitata come tinyint, smallinto integer* e se entrambe le colonne sono vincolate NOT NULL, la funzione hash è "perfetta", il che significa che non vi è alcuna possibilità di una collisione hash e che il processore di query non deve controllare i valori di nuovo per assicurarsi che corrispondano davvero.

Altrimenti, vedrai un residuo poiché gli oggetti nel bucket hash vengono testati per una corrispondenza, non solo una corrispondenza della funzione hash.

Il tuo test non specifica NULLNOT NULLper le colonne (una cattiva pratica, a proposito), quindi sembra che tu stia utilizzando un database dove NULLè l'impostazione predefinita.

Maggiori informazioni nel mio post Partecipa a Performance, Conversioni implicite e Residui e Hash Join Execution Internals di Dmitry Pilugin.


* Altri tipi idonei sono bit , smalldatetime , smallmoney e (var) char (n) per n = 1 e fascicolazione binaria

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.