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:
<code class="language-sql">SELECT t1.*, t2o.* FROM t1 CROSS APPLY ( SELECT TOP 3 * FROM t2 WHERE t2.t1_id = t1.id ORDER BY t2.rank DESC ) t2o</code>
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:
<code class="language-sql">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</code>
Walau bagaimanapun, kaedah ini kurang boleh dibaca dan mungkin kurang berkesan dalam sesetengah kes.
Contoh:
Untuk menggambarkan perbezaan prestasi, pertimbangkan pertanyaan berikut:
<code class="language-sql">-- 使用 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</code>
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!