Скажімо, у нас такий запит:
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 не може використовувати лише стовпчик зонда? Чому для повторного фільтрування рядків доводиться використовувати той же стовпчик, що й залишок?
Довідкові матеріали для тестових даних: