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