sql >> Database teknologi >  >> RDS >> Sqlserver

Hvornår skal jeg bruge CROSS APPLY over INNER JOIN?

Kan nogen give mig et godt eksempel på, hvornår CROSS APPLY gør en forskel i de tilfælde, hvor INNER JOIN også vil fungere?

Se artiklen i min blog for detaljeret præstationssammenligning:

  • INNER JOIN vs. CROSS APPLY

CROSS APPLY fungerer bedre på ting, der ikke har nogen simpel JOIN tilstand.

Denne vælger 3 sidste poster fra t2 for hver post fra 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 ikke nemt formuleres med en INNER JOIN tilstand.

Du kunne sikkert gøre sådan noget ved at bruge CTE 's og vinduesfunktion:

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 dette er mindre læsbart og sandsynligvis mindre effektivt.

Opdatering:

Har lige tjekket.

master er en tabel med omkring 20,000,000 poster med en PRIMARY KEYid .

Denne forespørgsel:

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ører i næsten 30 sekunder, mens denne:

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

er øjeblikkelig.



  1. Sådan ændres en standard MySQL/MariaDB-datakatalog i Linux

  2. Multi-Cloud-implementering til MariaDB-replikering ved hjælp af WireGuard

  3. psycopg2.OperationalError:FATAL:ikke-understøttet frontend-protokol 1234.5679:server understøtter 2.0 til 3.0

  4. Sådan får du gendannelsesmodellen for en database i SQL Server ved hjælp af T-SQL