Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kapan saya harus menggunakan CROSS APPLY daripada INNER JOIN?

Adakah yang bisa memberi saya contoh yang baik tentang kapan CROSS APPLY membuat perbedaan dalam kasus-kasus di mana INNER JOIN juga berfungsi?

Lihat artikel di blog saya untuk perbandingan kinerja mendetail:

  • INNER JOIN vs. CROSS APPLY

CROSS APPLY bekerja lebih baik pada hal-hal yang tidak memiliki JOIN sederhana kondisi.

Yang ini memilih 3 catatan terakhir dari t2 untuk setiap record dari 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

Itu tidak dapat dengan mudah diformulasikan dengan INNER JOIN kondisi.

Anda mungkin bisa melakukan sesuatu seperti itu menggunakan CTE 's dan fungsi jendela:

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

, tetapi ini kurang dapat dibaca dan mungkin kurang efisien.

Pembaruan:

Baru saja diperiksa.

master adalah tabel sekitar 20,000,000 merekam dengan PRIMARY KEY di id .

Kueri ini:

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

berjalan selama hampir 30 detik, sedangkan yang ini:

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

instan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SET versus SELECT saat menetapkan variabel?

  2. SQL Query untuk Rolling Average 7 Hari di SQL Server

  3. SSMS Kini Hadir dengan Azure Data Studio

  4. Cara mengatur nilai bool dalam SQL

  5. Cara mempercepat penyisipan massal ke MS SQL Server menggunakan pyodbc