sql >> Database >  >> RDS >> Sqlserver

Wanneer moet ik CROSS APPLY over INNER JOIN gebruiken?

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.



  1. Op records gebaseerd invoegen en bijwerken in Oracle

  2. SQL Server:Hoe krijg ik een refererende sleutelreferentie van information_schema?

  3. hoe de max_allowed_packet mysql-variabele te controleren en in te stellen

  4. Hoe te kopiëren van CSV-bestand naar PostgreSQL-tabel met headers in CSV-bestand?