Hash keys sonde et résiduel


21

Disons, nous avons une requête comme celle-ci:

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

En supposant que la requête ci-dessus utilise une jointure par hachage et a un résidu, la clé de sonde sera col1et le résidu sera len(a.col1)=10.

Mais en passant par un autre exemple, j'ai pu voir que la sonde et le résidu étaient la même colonne. Voici une élaboration de ce que j'essaie de dire:

Requete:

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

Plan d'exécution, avec sonde et résiduel mis en évidence:

entrez la description de l'image ici

Données de 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

Question:

Comment une sonde et un résidu peuvent-ils être la même colonne? Pourquoi SQL Server ne peut-il utiliser que la colonne de sonde? Pourquoi doit-il utiliser la même colonne comme résiduel pour filtrer à nouveau les lignes?

Références pour les données de test:

Réponses:


22

Si la jointure est sur une seule colonne typé tinyint, smallintou integer* et si les deux colonnes sont contraints d'être NOT NULL, la fonction de hachage est « parfait » - ce qui signifie qu'il n'y a aucune chance d'une collision de hachage, et le processeur de requête ne doit pas vérifier les valeurs à nouveau pour s'assurer qu'elles correspondent vraiment.

Sinon, vous verrez un résidu car les éléments du compartiment de hachage sont testés pour une correspondance, pas seulement une correspondance de fonction de hachage.

Votre test ne spécifie pas NULLou NOT NULLpour les colonnes (une mauvaise pratique, soit dit en passant), il semble donc que vous utilisez une base de données où NULLest la valeur par défaut.

Plus d'informations dans mon article Join Performance, Implicit Conversions, and Residuals and Hash Join Execution Internals par Dmitry Pilugin.


* Les autres types éligibles sont bit , smalldatetime , smallmoney et (var) char (n) pour n = 1 et le classement binaire

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.