4
SELECT a.title, s.name
FROM albums a JOIN songs s ON a.id = s.album_id;
Построение хеш-таблицы
1
6
4
Yellow Submarine
Abbey Road
The Beatles
3 Let It Be
1969
1969
1968
1970
3
6
Let It Be
Abbey Road
4 The Beatles
10100001
10001001
01000100
1 Yellow Submarine11000111
id title year
01
10
00
11
номер
корзины
work_mem × hash_mem_multiplier
id titleхеш-код
участвует
в условии
соединения
используется
в запросе
внутренний набор
Первым этапом в памяти строится хеш-таблица.
Идея хеширования состоит в том, что функция хеширования
равномерно распределяет значения по ограниченному числу корзин
хеш-таблицы. В таком случае разные значения как правило будут
попадать в разные корзины. Если равномерности не будет, в одну
корзину может попасть много значений. В таком случае они
выстраиваются в список, и по мере увеличения длины списка
эффективность поиска по хеш-таблице будет падать.
Итак, строки первого набора читаются последовательно, и для каждой
из них вычисляется хеш-функция от значения полей, входящих
в условие соединения (в нашем примере — числовые
идентификаторы).
По значению хеш-функции определяется номер корзины. Например,
если используется 4 корзины, то в качестве номера корзины можно
взять два младших бита.
В корзину хеш-таблицы помещаются вычисленный хеш-код и все поля,
которые входят в условие соединения или используются в запросе.
Размер хеш-таблицы в памяти ограничен значением work_mem ×
× hash_mem_multiplier. Наилучшая эффективность достигается, если
вся хеш-таблица помещается в этот объем памяти целиком. (Это еще
одна причина не использовать в запросе лишние поля, в том числе,
«звездочку».)
Исходный код алгоритма можно найти в файле
src/backend/executor/nodeHashjoin.c.