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 JOINvs.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.