Phím băm thăm dò và dư


21

Nói, chúng tôi có một truy vấn như thế này:

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

Giả sử truy vấn trên sử dụng Hash Join và có phần dư, khóa thăm dò sẽ là col1và phần dư sẽ là len(a.col1)=10.

Nhưng trong khi đi qua một ví dụ khác, tôi có thể thấy cả đầu dò và phần dư là cùng một cột. Dưới đây là một chi tiết về những gì tôi đang cố gắng nói:

Truy vấn:

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

Kế hoạch thực hiện, với đầu dò và phần dư được tô sáng:

nhập mô tả hình ảnh ở đây

Dữ liệu kiểm tra:

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

Câu hỏi:

Làm thế nào một đầu dò và một phần dư có thể là cùng một cột? Tại sao SQL Server không thể chỉ sử dụng cột thăm dò? Tại sao nó phải sử dụng cùng một cột như một phần dư để lọc các hàng một lần nữa?

Tài liệu tham khảo cho dữ liệu thử nghiệm:

Câu trả lời:


22

Nếu phép nối nằm trên một cột được nhập là tinyint, smallinthoặc integer* và nếu cả hai cột bị ràng buộc NOT NULL, thì hàm băm là 'hoàn hảo' - có nghĩa là không có khả năng xảy ra xung đột băm và bộ xử lý truy vấn không phải kiểm tra các giá trị một lần nữa để đảm bảo chúng thực sự phù hợp.

Mặt khác, bạn sẽ thấy phần dư vì các mục trong nhóm băm được kiểm tra khớp, không chỉ khớp với hàm băm.

Thử nghiệm của bạn không chỉ định NULLhoặc NOT NULLcho các cột (một cách thực hành tồi, nhân tiện), do đó, có vẻ như bạn đang sử dụng một cơ sở dữ liệu NULLmặc định.

Thông tin thêm trong bài viết của tôi Tham gia hiệu suất, chuyển đổi ngầm định, và cư dânHash tham gia thực tập thực thi của Dmitry Pilugin.


* Các loại đủ điều kiện khác là bit , smalldatetime , smallmoney(var) char (n) cho n = 1 và đối chiếu nhị phân

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.