Heim > Datenbank > MySQL-Tutorial > Wann übertrifft CROSS APPLY die Leistung von INNER JOIN in SQL-Abfragen?

Wann übertrifft CROSS APPLY die Leistung von INNER JOIN in SQL-Abfragen?

Linda Hamilton
Freigeben: 2025-01-20 11:37:10
Original
862 Leute haben es durchsucht

When Does CROSS APPLY Outperform INNER JOIN in SQL Queries?

Wann ist CROSS APPLY in SQL-Abfragen besser als INNER JOIN?

Frage:

Wann ist es in einer SQL-Abfrage effizienter, CROSS APPLY als INNER JOIN zu verwenden? Obwohl sie in Viele-zu-Eins-Beziehungen gleichwertig zu sein scheinen, sind Beispiele für die Leistungsvorteile von CROSS APPLY schwer zu finden.

Antwort:

Vorteile von CROSS APPLY bei komplexen Zusammenhängen:

CROSS APPLY zeigt seine Vorteile, wenn die verknüpfte Tabelle komplexe Bedingungen aufweist, die mit INNER JOIN nicht einfach ausgedrückt werden können. Betrachten Sie das folgende Beispiel:

<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>
Nach dem Login kopieren

Diese Abfrage ruft für jeden Datensatz in t1 die drei neuesten Datensätze in t2 ab. Dies kann mit INNER JOIN nicht einfach erreicht werden.

Leistungsvergleich zwischen CTE und CROSS APPLY:

Eine Alternative zu CROSS APPLY ist die Verwendung eines Common Table Expression (CTE) mit einer Fensterfunktion:

<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>
Nach dem Login kopieren

Diese Methode ist jedoch weniger lesbar und in manchen Fällen möglicherweise weniger effizient.

Beispiel:

Um den Leistungsunterschied zu veranschaulichen, betrachten Sie die folgende Abfrage:

<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>
Nach dem Login kopieren

Bei einer Tabelle mit etwa 20.000.000 Datensätzen dauert die Ausführung der CTE-Abfrage fast 30 Sekunden, während die CROSS APPLY-Abfrage sofort abgeschlossen wird.

Das obige ist der detaillierte Inhalt vonWann übertrifft CROSS APPLY die Leistung von INNER JOIN in SQL-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage