Chúng tôi có thể buộc SQL Server thực hiện chính xác điều này và xem điều gì thực sự xảy ra.
R có 1000 tuple và 100 truy cập trang = 10 tuples / page = 806 byte / tuple.
S có 50 tuple và 25 truy cập trang = 2 tuples / page = 4030 byte / tuple.
Đây là các bảng:
drop table if exists dbo.R;
drop table if exists dbo.S;
go
create table dbo.R(n int, filler char(785) not null default '');
create table dbo.S(n int, filler char(3990) not null default '');
Kích thước cột Filler đã được làm tròn xuống để cho phép hàng trên cao. Lưu ý rằng không có chỉ mục. Tôi có một bảng "số" mà tôi sẽ sử dụng để điền R và S:
insert dbo.R(n) select Number from dbo.Numbers where Number between 1 and 1000;
insert dbo.S(n) select Number from dbo.Numbers where Number between 1 and 50;
Chúng tôi có thể kiểm tra xem có bao nhiêu trang có liên quan:
set statistics io on;
select * from R
select * from S
Tab tin nhắn của SSMS hiển thị
Table 'R'. Scan count 1, logical reads 100, ...
Table 'S'. Scan count 1, logical reads 25, ...
Chúng tôi có đúng số lượng trang. Một chút trò đùa-pokery sẽ có được hành vi bạn muốn kiểm tra
select *
from dbo.R -- R will be outer
inner loop join dbo.S
on r.N = s.N
option
(
force order, -- dictate which table is outer and which inner
NO_PERFORMANCE_SPOOL -- stop the QO from doing something clever but distracting
);
select *
from dbo.S -- S will be outer
inner loop join dbo.R
on r.N = s.N
option (force order, NO_PERFORMANCE_SPOOL);
Cung cấp cái này trong tab tin nhắn (bảng bên trong được liệt kê trước bảng bên ngoài)
Table 'S'. Scan count 1, logical reads 25000, ...
Table 'R'. Scan count 1, logical reads 100, ...
Table 'R'. Scan count 1, logical reads 5000, ..
Table 'S'. Scan count 1, logical reads 25, ...
Trong SQL Server thực hiện truy vấn tiến hành hàng khôn ngoan. Đối với mỗi hàng trong bảng bên ngoài, (các) hàng tương ứng trong bảng bên trong sẽ được tham chiếu. Vì không có chỉ mục, tùy chọn duy nhất là đọc tất cả các hàng (tức là tất cả các trang) từ bảng bên trong mỗi lần. Đối với R-jo-S, chúng tôi có 1.000 hàng ngoài gấp 25 lần trang bên trong cung cấp 25.000 tài liệu tham khảo trang bên trong, tất nhiên, 100 tài liệu tham khảo trang bên ngoài. Đối với S-jo-R, có 50 hàng lần 100 trang, cung cấp 5.000 tham chiếu trang bên trong cộng với 25 tham chiếu trang bên ngoài.
Về mặt so sánh tuple bạn đúng - sẽ có so sánh O (R) xO (S) - 50.000. Điều này được hỗ trợ bằng cách nhìn vào kế hoạch truy vấn. Đối với cả hai truy vấn, "Số lượng hàng đã đọc" cho các tham chiếu bảng bên trong là 50.000.
Nếu có chỉ mục, trình tối ưu hóa truy vấn (QO) có các lựa chọn khác ngoài quét bảng. Tua lại có thể được sử dụng cho các phím ngoài trùng lặp. Không có trang nào có thể được đọc cho các khóa không khớp. Trong trường hợp cực đoan khi một ràng buộc nói rằng không thể có bất kỳ kết quả khớp nào, bảng bên trong thậm chí có thể không được tham chiếu.