sql >> Databasteknik >  >> RDS >> Sqlserver

När ska jag använda CROSS APPLY över INNER JOIN?

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 kontra CROSS 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 KEYid .

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.



  1. PostgreSQL:Skapa index för boolesk kolumn

  2. Beräkna tidsskillnaden mellan två rader

  3. java.math.BigInteger kan inte castas till java.lang.Integer

  4. Vilket är formatet för PostgreSQL-anslutningssträngen/URL?