Вложенное соединение против слияния Присоединение против хеш-соединения в PostgreSQL
Я знаю, как
Вложенное соединение
Объединить присоединиться
Hash Join
работает и его функциональность.
Я хотел знать, в какой ситуации эти соединения используются в Postgres
Ответ 1
Ниже приведены несколько практических правил:
Соединения с вложенными циклами предпочтительны, если на одной из сторон объединения есть несколько строк. Соединения с вложенными циклами также используются в качестве единственной опции, если условие соединения не использует оператор равенства.
Хеш-объединения предпочтительнее, если в условии соединения используется оператор равенства, и обе стороны объединения большие, а хэш вписывается в work_mem.
Объединения слиянием предпочтительнее, если в условии соединения используется оператор равенства, и обе стороны объединения большие, но их можно эффективно отсортировать по условию соединения (например, если в выражениях, используемых в столбце соединения, есть индекс).
Типичный OLTP-запрос, который выбирает только одну строку из одной таблицы и связанные строки из другой таблицы, всегда будет использовать соединение с вложенным циклом в качестве единственного эффективного метода.
Запросы, объединяющие таблицы со многими строками (которые нельзя отфильтровать до объединения), будут очень неэффективными при объединении с вложенным циклом и всегда будут использовать соединение с помощью хеша или слияния, если это позволяет условие объединения.
Оптимизатор рассматривает каждую из этих стратегий объединения и использует ту, которая обещает самые низкие затраты. Наиболее важным фактором, на котором основано это решение, является расчетное количество строк с обеих сторон объединения. Следовательно, неправильный выбор оптимизатора обычно вызван ошибочными оценками в числе строк.