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>
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>
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>
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!