Понимание того, как работает хеш-соединение - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть следующий план выполнения для этого запроса:

EXPLAIN SELECT * FROM houses INNER JOIN users ON houses.creator_id = users.id;

Hash Join  (cost=16.52..20.79 rows=100 width=600)
  Hash Cond: (houses.creator_id = users.id)
  ->  Seq Scan on houses  (cost=0.00..4.00 rows=100 width=348)
  ->  Hash  (cost=12.90..12.90 rows=290 width=252)
        ->  Seq Scan on users  (cost=0.00..12.90 rows=290 width=252)

Если я правильно понял алгоритм хеш-соединения, то он помещает правильное отношение (users) в хеш-таблицу, а затемнайдите соответствующие строки в левом отношении (houses), используя эту хэш-таблицу быстрого доступа.

Однако я не знаю, как это соответствует этому EXPLAIN.Почему выполняется последовательное сканирование на houses?Я понимаю, что последовательное сканирование users - это сброс всех этих данных в хеш, но почему сканирование seq на houses?

1 Ответ

0 голосов
/ 04 апреля 2019

Вы ошиблись вторым шагом:

  • Сначала сканируется внутреннее отношение и хэшируется условие соединения. Таким образом, строится хеш-структура.

  • Во-вторых, сканируется внешнее отношение , и в хэш-таблице проверяются совпадения для каждой найденной строки.

Если бы второй шаг был наоборот, у вас было бы соединение с вложенным циклом с ненужным шагом хеширования.

...