Except operatörünün SQL Server'daki kapaklar altında nasıl çalıştığının iç algoritması nedir ? Dahili olarak her satırın bir karmasını alır ve karşılaştırır mı?
David Lozinksi bir çalışma yürüttü, SQL: Henüz mevcut olmayan yeni kayıtlar eklemenin en hızlı yolu , İfade ifadesinin çok sayıda satır için en hızlı olduğunu gösterdi; aşağıdaki sonuçlarımızla yakından bağlantılıdır.
Varsayım: Sadece 1 sütunu karşılaştırdığı için Sol birleştirmenin en hızlı olacağını düşünürüm, Tüm sütunları karşılaştırmak zorunda olduğu için en uzun süreceği hariç.
Bu sonuçlarla, şimdi düşüncemiz otomatik olarak ve dahili olarak her satırdan bir karma alır? İnfaz planı dışında baktım ve bazı karma kullanır.
Arka plan: Ekibimiz iki yığın tablosunu karşılaştırıyordu. Tablo A Tablo B'de olmayan satırlar Tablo B'ye eklenmiştir.
Yığın tablolarında (eski metin dosya sisteminden) birincil anahtarlar / kılavuzlar / tanımlayıcılar yoktur. Bazı tabloların yinelenen satırları vardı, bu nedenle her satırın Hash'ini bulduk ve yinelemeleri kaldırdık ve Birincil anahtar tanımlayıcıları oluşturduk.
1) Öncelikle (karma sütunu) hariç, bir dışlama ifadesi çalıştırdık
select * from TableA
Except
Select * from TableB,
2) Sonra HashRowId üzerinde iki tablo arasında bir karşılaştırma birleştirme koştu
select *
FROM dbo.TableA A
left join dbo.TableB B
on A.RowHash = B.RowHash
where B.Hash is null
şaşırtıcı bir şekilde Hariç İfadesi Ekle en hızlı oldu.
Sonuçlar aslında David Lozinksi'nin test sonuçlarına yakın harita