Вложенное соединение против слияния Присоединение против хеш-соединения в PostgreSQL

Я знаю, как

  1. Вложенное соединение
  2. Объединить присоединиться
  3. Hash Join

работает и его функциональность.

Я хотел знать, в какой ситуации эти соединения используются в Postgres

Ответ 1

Ниже приведены несколько практических правил:

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

  • Хеш-объединения предпочтительнее, если в условии соединения используется оператор равенства, и обе стороны объединения большие, а хэш вписывается в work_mem.

  • Объединения слиянием предпочтительнее, если в условии соединения используется оператор равенства, и обе стороны объединения большие, но их можно эффективно отсортировать по условию соединения (например, если в выражениях, используемых в столбце соединения, есть индекс).

Типичный OLTP-запрос, который выбирает только одну строку из одной таблицы и связанные строки из другой таблицы, всегда будет использовать соединение с вложенным циклом в качестве единственного эффективного метода.

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

Оптимизатор рассматривает каждую из этих стратегий объединения и использует ту, которая обещает самые низкие затраты. Наиболее важным фактором, на котором основано это решение, является расчетное количество строк с обеих сторон объединения. Следовательно, неправильный выбор оптимизатора обычно вызван ошибочными оценками в числе строк.