Kan iemand mij een goed voorbeeld geven van wanneer CROSS APPLY een verschil maakt in die gevallen waar INNER JOIN ook zal werken?
Zie het artikel in mijn blog voor gedetailleerde prestatievergelijking:
INNER JOIN
vs.CROSS APPLY
CROSS APPLY
werkt beter bij dingen die geen simpele JOIN
. hebben staat.
Deze selecteert 3
laatste records van t2
voor elk record van 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
Het kan niet gemakkelijk worden geformuleerd met een INNER JOIN
staat.
Je zou waarschijnlijk zoiets kunnen doen met CTE
's en venster functie:
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
, maar dit is minder leesbaar en waarschijnlijk minder efficiënt.
Bijwerken:
Net gecontroleerd.
master
is een tabel van ongeveer 20,000,000
records met een PRIMARY KEY
op id
.
Deze vraag:
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
loopt bijna 30
seconden, terwijl deze:
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
is direct.