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

IN vs. BERGABUNG dengan rowsets besar

Pembaruan:

Artikel di blog saya ini merangkum jawaban saya dan komentar saya untuk jawaban lain, dan menunjukkan rencana eksekusi yang sebenarnya:

SELECT  *
FROM    a
WHERE   a.c IN (SELECT d FROM b)

SELECT  a.*
FROM    a
JOIN    b
ON      a.c = b.d

Kueri ini tidak setara. Mereka dapat memberikan hasil yang berbeda jika tabel Anda b bukan kunci yang dipertahankan (yaitu nilai b.d tidak unik).

Setara dengan kueri pertama adalah sebagai berikut:

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT d
        FROM    b
        ) bo
ON      a.c = bo.d

Jika b.d adalah UNIQUE dan ditandai seperti itu (dengan UNIQUE INDEX atau UNIQUE CONSTRAINT ), maka kueri ini identik dan kemungkinan besar akan menggunakan paket yang identik, karena SQL Server cukup pintar untuk mempertimbangkan hal ini.

SQL Server dapat menggunakan salah satu metode berikut untuk menjalankan kueri ini:

  • Jika ada indeks di a.c , d adalah UNIQUE dan b relatif kecil dibandingkan dengan a , kemudian kondisi disebarkan ke subquery dan INNER JOIN biasa digunakan (dengan b terkemuka)

  • Jika ada indeks pada b.d dan d bukan UNIQUE , maka kondisinya juga disebarkan dan LEFT SEMI JOIN digunakan. Bisa juga digunakan untuk kondisi di atas.

  • Jika ada indeks pada kedua b.d dan a.c dan ukurannya besar, lalu MERGE SEMI JOIN digunakan

  • Jika tidak ada indeks pada tabel apa pun, maka tabel hash dibangun di atas b dan HASH SEMI JOIN digunakan.

Tidak keduanya dari metode ini mengevaluasi kembali seluruh subquery setiap kali.

Lihat entri ini di blog saya untuk detail lebih lanjut tentang cara kerjanya:

Ada tautan untuk semua RDBMS dari empat besar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jelajahi Penyebab, &Solusi Korupsi Database SQL Server

  2. Dapatkan catatan yang berisi semua catatan anak di server sql

  3. Klausa WHERE pada tipe data Teks SQL Server

  4. Menggunakan Pencarian Teks Lengkap di SQL Server 2008 di beberapa tabel, kolom

  5. Menjelajahi Opsi Tunggu Kunci Prioritas Rendah di SQL Server 2014 CTP1