Digamos que tenemos una consulta como esta:
select a.*,b.*
from
a join b
on a.col1=b.col1
and len(a.col1)=10
Suponiendo que la consulta anterior utiliza una combinación de hash y tiene un residual, la clave de la sonda será col1
y el residual será len(a.col1)=10
.
Pero al pasar por otro ejemplo, pude ver que tanto la sonda como el residual son la misma columna. A continuación hay una explicación de lo que estoy tratando de decir:
Consulta:
select *
from T1 join T2 on T1.a = T2.a
Plan de ejecución, con sonda y residual resaltados:
Datos de prueba:
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
Pregunta:
¿Cómo pueden una sonda y un residuo ser la misma columna? ¿Por qué SQL Server no puede usar solo la columna de la sonda? ¿Por qué tiene que usar la misma columna como residual para filtrar filas nuevamente?
Referencias para datos de prueba: