Může mi někdo dát dobrý příklad toho, kdy CROSS APPLY znamená rozdíl v případech, kdy bude fungovat i INNER JOIN?
Podrobné srovnání výkonu najdete v článku na mém blogu:
INNER JOINvs.CROSS APPLY
CROSS APPLY funguje lépe na věcech, které nemají jednoduchý JOIN podmínka.
Tento vybere 3 poslední záznamy z t2 pro každý záznam 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
Nelze jej snadno formulovat pomocí INNER JOIN podmínka.
Něco takového byste pravděpodobně mohli udělat pomocí CTE Funkce a funkce 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 toto je méně čitelné a pravděpodobně méně efektivní.
Aktualizace:
Právě zkontrolováno.
master je tabulka přibližně 20,000,000 záznamy s PRIMARY KEY na id .
Tento dotaz:
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
běží téměř 30 sekund, zatímco tento:
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
je okamžitý.