web-dev-qa-db-fra.com

Touches de hachage sonde et résiduel

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 col1 Et 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:

Requête:

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

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

enter image description here

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:

21
TheGameiswar

Si la jointure se trouve sur une seule colonne de type tinyint, smallint ou integer * et si les deux colonnes sont contraintes d'être NOT NULL, la fonction de hachage est "parfaite" - ce qui signifie qu'il n'y a aucune chance de collision de hachage, et le processeur de requêtes n'a pas à vérifier à nouveau les valeurs 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 NULL ou NOT NULL pour les colonnes (une mauvaise pratique d'ailleurs), il semble donc que vous utilisez une base de données où NULL est 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 de qualification sont bit , smalldatetime , smallmoney , et (var) char (n) pour n = 1 et classement binaire

22
Paul White 9