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
Lepaskan: 2025-01-20 11:37:10
asal
908 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan