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:
SELECT t1.*, t2o.* FROM t1 CROSS APPLY ( SELECT TOP 3 * FROM t2 WHERE t2.t1_id = t1.id ORDER BY t2.rank DESC ) t2o
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:
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
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:
-- 使用 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
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!