Adakah yang bisa memberi saya contoh yang baik tentang kapan CROSS APPLY membuat perbedaan dalam kasus-kasus di mana INNER JOIN juga berfungsi?
Lihat artikel di blog saya untuk perbandingan kinerja mendetail:
INNER JOIN
vs.CROSS APPLY
CROSS APPLY
bekerja lebih baik pada hal-hal yang tidak memiliki JOIN
sederhana kondisi.
Yang ini memilih 3
catatan terakhir dari t2
untuk setiap record dari 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
Itu tidak dapat dengan mudah diformulasikan dengan INNER JOIN
kondisi.
Anda mungkin bisa melakukan sesuatu seperti itu menggunakan CTE
's dan fungsi jendela:
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
, tetapi ini kurang dapat dibaca dan mungkin kurang efisien.
Pembaruan:
Baru saja diperiksa.
master
adalah tabel sekitar 20,000,000
merekam dengan PRIMARY KEY
di id
.
Kueri ini:
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
berjalan selama hampir 30
detik, sedangkan yang ini:
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
instan.