Có ai có thể cho tôi một ví dụ điển hình về thời điểm ÁP DỤNG CROSS tạo ra sự khác biệt trong những trường hợp INNER JOIN cũng hoạt động không?
Xem bài viết trong blog của tôi để so sánh hiệu suất chi tiết:
-
INNER JOIN
so vớiCROSS APPLY
CROSS APPLY
hoạt động tốt hơn trên những thứ không đơn giản JOIN
điều kiện.
Cái này chọn 3
bản ghi cuối cùng từ t2
cho mỗi bản ghi từ t1
:
SELECT t1.*, t2o.*
FROM t1
CROSS APPLY
(
SELECT TOP 3 *
FROM t2
WHERE t2.t1_id = t1.id
ORDER BY
t2.rank DESC
) t2o
Nó không thể được xây dựng dễ dàng với INNER JOIN
điều kiện.
Bạn có thể làm điều gì đó tương tự bằng cách sử dụng CTE
của và chức năng cửa sổ:
WITH t2o AS
(
SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
FROM t2
)
SELECT t1.*, t2o.*
FROM t1
INNER JOIN
t2o
ON t2o.t1_id = t1.id
AND t2o.rn <= 3
, nhưng điều này khó đọc hơn và có lẽ kém hiệu quả hơn.
Cập nhật:
Vừa được kiểm tra.
master
là một bảng khoảng 20,000,000
bản ghi bằng PRIMARY KEY
trên id
.
Truy vấn này:
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM master
),
t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
JOIN q
ON q.rn <= t.id
chạy gần 30
giây, trong khi cái này:
WITH t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
CROSS APPLY
(
SELECT TOP (t.id) m.*
FROM master m
ORDER BY
id
) q
là tức thì.