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:
Requete:
select *
from T1 join T2 on T1.a = T2.a
Plan d'exécution, avec sonde et résiduel mis en évidence:
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: