Probe kunci hash dan residu

21

Katakanlah, kami memiliki permintaan seperti ini:

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

Dengan asumsi permintaan di atas menggunakan Gabung Hash dan memiliki residu, kunci penyelidikan akan col1dan residu akan len(a.col1)=10.

Tetapi ketika sedang melalui contoh lain, saya bisa melihat baik probe dan residual menjadi kolom yang sama. Di bawah ini adalah uraian tentang apa yang ingin saya katakan:

Pertanyaan:

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

Rencana pelaksanaan, dengan probe dan residu disorot:

masukkan deskripsi gambar di sini

Data uji:

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

Pertanyaan:

Bagaimana bisa probe dan residu menjadi kolom yang sama? Mengapa SQL Server tidak bisa menggunakan kolom probe saja? Mengapa harus menggunakan kolom yang sama dengan residu untuk menyaring baris lagi?

Referensi untuk data uji:

TheGameiswar
sumber

Jawaban:

22

Jika gabungan ada pada satu kolom yang diketikkan sebagai tinyint,, smallintatau integer* dan jika kedua kolom dibatasi NOT NULL, fungsi hash 'sempurna' - artinya tidak ada kemungkinan tabrakan hash, dan prosesor kueri tidak harus memeriksa nilai-nilai lagi untuk memastikan mereka benar-benar cocok.

Jika tidak, Anda akan melihat residu karena item dalam ember hash diuji untuk kecocokan, bukan hanya kecocokan fungsi hash.

Tes Anda tidak menentukan NULLatau NOT NULLuntuk kolom (praktik buruk, omong-omong), sehingga tampaknya Anda menggunakan database yang NULLmerupakan defaultnya.

Informasi lebih lanjut di posting saya Gabung Kinerja, Konversi Tersirat, dan Residu dan Hash Bergabung dengan Internal Eksekusi oleh Dmitry Pilugin.


* Jenis kualifikasi lainnya adalah bit , smalldatetime , smallmoney , dan (var) char (n) untuk n = 1 dan binary collation

Paul White mengatakan GoFundMonica
sumber