Ключі хеш-зонду та залишки


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 не може використовувати лише стовпчик зонда? Чому для повторного фільтрування рядків доводиться використовувати той же стовпчик, що й залишок?

Довідкові матеріали для тестових даних:

Відповіді:


22

Якщо приєднання відбувається в одному стовпчику, набраному як tinyint, smallintабо integer* і якщо обидва стовпчики обмежені NOT NULLяк функція, хеш-функція є "ідеальною" - це означає, що немає шансів хеш-зіткнення, і процесор запитів не повинен перевіряти значення знову, щоб переконатися, що вони дійсно відповідають.

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

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

Додаткову інформацію у моєму дописі Приєднайтесь до продуктивності, непрямих перетворень, а також залишків та хеш-інтернету для внутрішніх виконавців Дмитра Пілугіна.


* Інші класифікуючі типи - біт , малий час , малий гроші та (вар) шрифт (n) для n = 1 та двійкове порівняння

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.