Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Kiedy powinienem użyć CROSS APPLY zamiast INNER JOIN?

Czy ktoś może mi dać dobry przykład tego, kiedy CROSS APPLY ma znaczenie w tych przypadkach, w których funkcja INNER JOIN również będzie działać?

Zobacz artykuł na moim blogu, aby uzyskać szczegółowe porównanie wydajności:

  • INNER JOIN w porównaniu z CROSS APPLY

CROSS APPLY działa lepiej na rzeczach, które nie mają prostego JOIN stan.

Ten wybiera 3 ostatnie rekordy z t2 dla każdego rekordu 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

Nie można go łatwo sformułować za pomocą INNER JOIN stan.

Prawdopodobnie mógłbyś zrobić coś takiego za pomocą CTE i funkcja 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 jest to mniej czytelne i prawdopodobnie mniej wydajne.

Aktualizacja:

Właśnie sprawdziłem.

master to tabela zawierająca około 20,000,000 rekordy z PRIMARY KEY na id .

To zapytanie:

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

działa przez prawie 30 sekund, podczas gdy ten:

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

jest natychmiastowy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć część czasu z wartości daty i godziny (SQL Server)?

  2. Do czego służą nawiasy kwadratowe [] w instrukcjach sql?

  3. Czy istnieje generator POCO oparty na bazie danych Entity Framework 7?

  4. Błąd R DBI ODBC:nanodbc/nanodbc.cpp:3110:07009:[Microsoft][Sterownik ODBC 13 dla programu SQL Server]Nieprawidłowy indeks deskryptora

  5. Jak połączyć się z bazą danych SQL Server 2008 za pomocą JDBC?