Hash tuşları prob ve artık


21

Söyle, böyle bir sorgu var:

select a.*,b.*
from 
a join b
on a.col1=b.col1
and len(a.col1)=10

Yukarıdaki sorgunun bir Karma Birleştirme kullandığını ve bir artık olduğunu varsayarsak, prob anahtarı olacak col1ve artık olacaktır len(a.col1)=10.

Ama başka bir örnek üzerinden geçerken, hem probun hem de artıkların aynı sütun olduğunu gördüm. Aşağıda söylemeye çalıştığım konu hakkında bir ayrıntı var:

Sorgu:

select *
from T1 join T2 on T1.a = T2.a 

Prob ve artık vurgulanmış uygulama planı:

resim açıklamasını buraya girin

Test verisi:

create table T1 (a int, b int, x char(200))
create table T2 (a int, b int, x char(200))

set nocount on
declare @i int
set @i = 0
while @i < 1000
  begin
      insert T1 values (@i * 2, @i * 5, @i)
    set @i = @i + 1
  end

declare @i int
set @i = 0
while @i < 10000
  begin
    insert T2 values (@i * 3, @i * 7, @i)
    set @i = @i + 1
  end

Soru:

Bir prob ve artık nasıl aynı sütun olabilir? SQL Server neden yalnızca prob sütununu kullanamıyor? Neden satırları tekrar filtrelemek için artık sütunun aynı sütunu kullanması gerekiyor?

Test verileri için referanslar:

Yanıtlar:


22

Katılırsanız olan tek bir sütun daktilo olduğu gibi tinyint, smallintya da integer* her iki sütun olarak kısıtlanır ve eğer NOT NULL, hash fonksiyonu 'mükemmel' - bir karma çarpışma şansı yoktur anlamı ve sorgu işlemcisi kontrol zorunda değildir değerleri gerçekten eşleştiğinden emin olmak için tekrar.

Aksi takdirde, karma grubundaki öğeler yalnızca bir karma işlev eşleşmesi için değil, bir eşleşme için test edildiğinden bir artık göreceksiniz.

Testiniz , sütunlar için NULLveya NOT NULLbu arada (bu arada kötü bir uygulama) belirtmediğinden NULL, varsayılan olarak bir veritabanı kullandığınız anlaşılıyor .

Yazımda daha fazla bilgi Performansa, Örtülü Dönüşümlere ve Artıklara Katıl ve Karma Katıl Yürütme İçerisine ait: Dmitry Pilugin.


* Diğer niteleme türleri n = 1 için bit , smalldatetime , smallmoney ve (var) char (n) ve ikili harmanlamadır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.