Скажем, у нас есть такой запрос:
select a.*,b.*
from
a join b
on a.col1=b.col1
and len(a.col1)=10
Предполагая, что вышеупомянутый запрос использует Hash Join и имеет остаток, ключ пробника будет col1
и остаток будет len(a.col1)=10
.
Но, просматривая другой пример, я мог видеть и зонд, и остаток как один и тот же столбец. Ниже приведено подробное описание того, что я пытаюсь сказать:
Запрос:
select *
from T1 join T2 on T1.a = T2.a
План выполнения с выделением зонда и остатка:
Тестовые данные:
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
Вопрос:
Как зонд и остаток могут быть одним и тем же столбцом? Почему SQL Server не может использовать только столбец зондов? Почему он должен использовать тот же столбец в качестве остатка для повторной фильтрации строк?
Ссылки на тестовые данные: