Czy ktoś może mi dać dobry przykład tego, kiedy CROSS APPLY ma znaczenie w tych przypadkach, w których funkcja INNER JOIN również będzie działać?
Zobacz artykuł na moim blogu, aby uzyskać szczegółowe porównanie wydajności:
INNER JOIN
w porównaniu zCROSS APPLY
CROSS APPLY
działa lepiej na rzeczach, które nie mają prostego JOIN
stan.
Ten wybiera 3
ostatnie rekordy z t2
dla każdego rekordu z t1
:
SELECT t1.*, t2o.*
FROM t1
CROSS APPLY
(
SELECT TOP 3 *
FROM t2
WHERE t2.t1_id = t1.id
ORDER BY
t2.rank DESC
) t2o
Nie można go łatwo sformułować za pomocą INNER JOIN
stan.
Prawdopodobnie mógłbyś zrobić coś takiego za pomocą CTE
i funkcja okna:
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
, ale jest to mniej czytelne i prawdopodobnie mniej wydajne.
Aktualizacja:
Właśnie sprawdziłem.
master
to tabela zawierająca około 20,000,000
rekordy z PRIMARY KEY
na id
.
To zapytanie:
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
działa przez prawie 30
sekund, podczas gdy ten:
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
jest natychmiastowy.