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à col1
e 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:
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: