Hash keys sonda y residual

21

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á col1y 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:

ingrese la descripción de la imagen aquí

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:

TheGameiswar
fuente

Respuestas:

22

Si la unión está en una sola columna escrita como tinyint, smallinto integer* y si ambas columnas están restringidas NOT NULL, la función hash es 'perfecta', lo que significa que no hay posibilidad de una colisión hash, y el procesador de consultas no tiene que verificar los valores nuevamente para garantizar que realmente coincidan.

De lo contrario, verá un residuo ya que los elementos en el depósito hash se prueban para una coincidencia, no solo una coincidencia de función hash.

Su prueba no especifica NULLni NOT NULLpara las columnas (una mala práctica, por cierto), por lo que parece que está utilizando una base de datos donde NULLestá el valor predeterminado.

Más información en mi publicación Unirse a rendimiento, conversiones implícitas y residuos y Hash unirse a ejecuciones internas por Dmitry Pilugin.


* Otros tipos de calificación son bit , smalldatetime , smallmoney y (var) char (n) para n = 1 y colación binaria

Paul White dice GoFundMonica
fuente