Kan någon ge mig ett bra exempel på när CROSS APPLY gör skillnad i de fall då INNER JOIN också fungerar?
Se artikeln i min blogg för detaljerad prestandajämförelse:
INNER JOIN
kontraCROSS APPLY
CROSS APPLY
fungerar bättre på saker som inte har någon enkel JOIN
skick.
Den här väljer 3
senaste posterna från t2
för varje post från 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
Det kan inte enkelt formuleras med en INNER JOIN
skick.
Du kan förmodligen göra något liknande med CTE
s och fönsterfunktion:
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
, men det här är mindre läsbart och förmodligen mindre effektivt.
Uppdatering:
Kollade precis.
master
är en tabell med ungefär 20,000,000
poster med en PRIMARY KEY
på id
.
Denna fråga:
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
körs i nästan 30
sekunder, medan den här:
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
är omedelbar.