Ключи хеша пробные и остаточные

21

Скажем, у нас есть такой запрос:

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

Предполагая, что вышеупомянутый запрос использует Hash Join и имеет остаток, ключ пробника будет col1и остаток будет len(a.col1)=10.

Но, просматривая другой пример, я мог видеть и зонд, и остаток как один и тот же столбец. Ниже приведено подробное описание того, что я пытаюсь сказать:

Запрос:

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

План выполнения с выделением зонда и остатка:

введите описание изображения здесь

Тестовые данные:

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

Вопрос:

Как зонд и остаток могут быть одним и тем же столбцом? Почему SQL Server не может использовать только столбец зондов? Почему он должен использовать тот же столбец в качестве остатка для повторной фильтрации строк?

Ссылки на тестовые данные:

TheGameiswar
источник

Ответы:

22

Если объединить на один столбец набран , как tinyint, smallintили integer* , и если оба столбца ограничены быть NOT NULL, хэш - функция является «совершенным» - это означает , что нет никаких шансов хэш столкновения, и процессор запроса не должен проверить значения снова, чтобы убедиться, что они действительно совпадают.

В противном случае вы увидите остаток, так как элементы в хэш-корзине проверяются на совпадение, а не только на совпадение хеш-функции.

Ваш тест не указывает NULLни NOT NULLдля столбцов (кстати, это плохая практика), поэтому кажется, что вы используете базу данных, где NULLпо умолчанию.

Больше информации в моем посте Регистрация производительности, неявные преобразования, и ост и хеширования Execution Internals Дмитрий Пилюгин.


* Другие квалифицирующие типы: bit , smalldatetime , smallmoney и (var) char (n) для n = 1 и двоичного сопоставления

Пол Уайт говорит, что GoFundMonica
источник