sql >> Databáze >  >> RDS >> Sqlserver

Kdy mám použít CROSS APPLY přes INNER JOIN?

Může mi někdo dát dobrý příklad toho, kdy CROSS APPLY znamená rozdíl v případech, kdy bude fungovat i INNER JOIN?

Podrobné srovnání výkonu najdete v článku na mém blogu:

  • INNER JOIN vs. CROSS APPLY

CROSS APPLY funguje lépe na věcech, které nemají jednoduchý JOIN podmínka.

Tento vybere 3 poslední záznamy z t2 pro každý záznam z 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

Nelze jej snadno formulovat pomocí INNER JOIN podmínka.

Něco takového byste pravděpodobně mohli udělat pomocí CTE Funkce a funkce okna:

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

, ale toto je méně čitelné a pravděpodobně méně efektivní.

Aktualizace:

Právě zkontrolováno.

master je tabulka přibližně 20,000,000 záznamy s PRIMARY KEY na id .

Tento dotaz:

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

běží téměř 30 sekund, zatímco tento:

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

je okamžitý.



  1. Rozdělení řetězců:Nyní s menším množstvím T-SQL

  2. Jak přenášíte nebo exportujete data SQL Server 2005 do Excelu

  3. Instalace MySQL Pythonu na Mac OS X

  4. Transparent Data Encryption (TDE) na serveru SQL Server ve skupině AlwaysOn Availability na příkladu