Soalan:
Dalam pertanyaan SQL, bilakah lebih cekap menggunakan CROSS APPLY daripada INNER JOIN? Walaupun ia kelihatan setara dalam perhubungan banyak dengan satu, contoh manfaat prestasi CROSS APPLY sukar dicari.
Jawapan:
Kelebihan CROSS APPLY dalam sambungan yang kompleks:
CROSS APPLY menunjukkan kelebihannya apabila jadual yang dicantumkan mempunyai keadaan kompleks yang tidak boleh dinyatakan dengan mudah dengan INNER JOIN. Pertimbangkan contoh berikut:
SELECT t1.*, t2o.* FROM t1 CROSS APPLY ( SELECT TOP 3 * FROM t2 WHERE t2.t1_id = t1.id ORDER BY t2.rank DESC ) t2o
Pertanyaan ini mendapatkan semula tiga rekod terbaharu dalam t2 untuk setiap rekod dalam t1. Ini tidak boleh dicapai dengan mudah dengan INNER JOIN.
Perbandingan prestasi antara CTE dan CROSS APPLY:
Alternatif kepada CROSS APPLY ialah menggunakan ungkapan jadual biasa (CTE) dengan fungsi tetingkap:
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
Walau bagaimanapun, kaedah ini kurang boleh dibaca dan mungkin kurang berkesan dalam sesetengah kes.
Contoh:
Untuk menggambarkan perbezaan prestasi, pertimbangkan pertanyaan berikut:
-- 使用 CTE 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 -- 使用 CROSS APPLY 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
Di atas jadual dengan lebih kurang 20,000,000 rekod, pertanyaan CTE mengambil masa hampir 30 saat untuk dilaksanakan, manakala pertanyaan CROSS APPLY selesai serta-merta.
Atas ialah kandungan terperinci Bilakah CROSS APPLY Mengungguli INNER JOIN dalam SQL Queries?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!