Apa algoritma internal tentang bagaimana operator Kecuali bekerja di bawah selimut di SQL Server? Apakah secara internal mengambil hash dari setiap baris dan membandingkan?
David Lozinksi menjalankan penelitian, SQL: Cara tercepat untuk menyisipkan catatan baru di mana orang belum ada. Dia menunjukkan Kecuali pernyataan adalah yang tercepat untuk baris jumlah besar; terikat erat dengan hasil kami di bawah ini.
Asumsi: Saya pikir Left join akan menjadi yang tercepat, karena hanya membandingkan 1 kolom, Kecuali akan memakan waktu paling lama, karena harus membandingkan Semua kolom.
Dengan hasil ini, sekarang pemikiran kita adalah Kecuali secara otomatis dan internal mengambil hash dari setiap baris? Saya melihat Kecuali rencana eksekusi dan tidak menggunakan beberapa hash.
Latar belakang: Tim kami membandingkan dua tabel tumpukan. Tabel A Baris tidak pada Tabel B, dimasukkan ke dalam Tabel B.
Heap tables (dari filesystem teks lama) tidak memiliki kunci utama / pengarah / pengidentifikasi. Beberapa tabel memiliki baris duplikat, jadi kami menemukan Hash setiap baris, dan menghapus duplikat, dan membuat pengidentifikasi kunci utama.
1) Pertama kami menjalankan pernyataan kecuali, tidak termasuk (kolom hash)
select * from TableA
Except
Select * from TableB,
2) Kemudian kami menjalankan perbandingan gabungan kiri antara dua tabel pada HashRowId
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
secara mengejutkan Sisipan Pernyataan Kecuali adalah yang tercepat.
Hasil sebenarnya memetakan dekat dengan hasil pengujian dari David Lozinksi