Rumah >pangkalan data >tutorial mysql >Bilakah CROSS APPLY Mengungguli INNER JOIN dalam SQL Queries?

Bilakah CROSS APPLY Mengungguli INNER JOIN dalam SQL Queries?

Linda Hamilton
Linda Hamiltonasal
2025-01-20 11:37:10909semak imbas

When Does CROSS APPLY Outperform INNER JOIN in SQL Queries?

Bilakah CROSS APPLY lebih baik daripada INNER JOIN dalam pertanyaan SQL?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn