Powiedzmy, że mamy takie zapytanie:
select a.*,b.*
from
a join b
on a.col1=b.col1
and len(a.col1)=10
Zakładając, że powyższe zapytanie używa łączenia mieszającego i ma wartość resztkową, kluczem sondy będzie, col1
a resztą będzie len(a.col1)=10
.
Ale przechodząc przez inny przykład, widziałem zarówno sondę, jak i pozostałość, które są tą samą kolumną. Poniżej znajduje się wyjaśnienie tego, co próbuję powiedzieć:
Pytanie:
select *
from T1 join T2 on T1.a = T2.a
Plan wykonania, z podświetloną sondą i pozostałością:
Dane testowe:
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
Pytanie:
Jak sonda i reszta mogą być tą samą kolumną? Dlaczego SQL Server nie może używać tylko kolumny sondy? Dlaczego musi ponownie używać tej samej kolumny jako reszty, aby ponownie filtrować wiersze?
Referencje dla danych testowych: