Nói, chúng tôi có một truy vấn như thế này:
select a.*,b.*
from
a join b
on a.col1=b.col1
and len(a.col1)=10
Giả sử truy vấn trên sử dụng Hash Join và có phần dư, khóa thăm dò sẽ là col1
và phần dư sẽ là len(a.col1)=10
.
Nhưng trong khi đi qua một ví dụ khác, tôi có thể thấy cả đầu dò và phần dư là cùng một cột. Dưới đây là một chi tiết về những gì tôi đang cố gắng nói:
Truy vấn:
select *
from T1 join T2 on T1.a = T2.a
Kế hoạch thực hiện, với đầu dò và phần dư được tô sáng:
Dữ liệu kiểm tra:
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
Câu hỏi:
Làm thế nào một đầu dò và một phần dư có thể là cùng một cột? Tại sao SQL Server không thể chỉ sử dụng cột thăm dò? Tại sao nó phải sử dụng cùng một cột như một phần dư để lọc các hàng một lần nữa?
Tài liệu tham khảo cho dữ liệu thử nghiệm: