Соединение «сортировка слиянием» выполняется путем сортировки двух наборов данных, которые нужно объединить, в соответствии с ключами объединения, а затем их объединения. Слияние очень дешево, но сортировка может быть чрезмерно дорогой, особенно если сортировка выпадает на диск. Стоимость сортировки может быть снижена, если к одному из наборов данных можно получить доступ в отсортированном порядке через индекс, хотя доступ к высокой пропорции блоков таблицы с помощью сканирования индекса также может быть очень дорогим по сравнению с полным сканированием таблицы .
Хеш-соединение выполняется путем хеширования одного набора данных в памяти на основе столбцов соединения, чтения другого и проверки хеш-таблицы на совпадения. Хеш-соединение - это очень низкая стоимость, когда хеш-таблица может храниться полностью в памяти, при этом общая стоимость составляет немногим больше, чем стоимость чтения наборов данных. Стоимость возрастает, если хэш-таблицу необходимо пролить на диск в однопроходной сортировке, и значительно возрастает для многопроходной сортировки.
(В до 10g внешние соединения от большой к маленькой таблице были проблемными с точки зрения производительности, так как оптимизатор не мог решить необходимость доступа к меньшей таблице сначала для хеш-соединения, но большей таблицы - для первой внешнее объединение. Следовательно, в этой ситуации хеш-объединения были недоступны).
Стоимость хеш-соединения может быть уменьшена путем разбиения обеих таблиц на ключ (ы) соединения. Это позволяет оптимизатору сделать вывод, что строки из раздела в одной таблице найдут совпадение только в конкретном разделе другой таблицы, а для таблиц, имеющих n разделов, хеш-соединение выполняется как n независимых хеш-соединений. Это имеет следующие эффекты:
- Размер каждой хеш-таблицы уменьшен, что уменьшает максимальный объем требуемой памяти и потенциально устраняет необходимость в операции, требующей временного дискового пространства.
- Для операций с параллельными запросами объем межпроцессного обмена сообщениями значительно сокращается, что снижает загрузку ЦП и повышает производительность, поскольку каждое хеш-соединение может выполняться одной парой процессов PQ.
- Для непараллельных операций запроса потребность в памяти уменьшается в n раз, и первые строки проецируются из запроса ранее.
Следует отметить, что хеш-объединения могут использоваться только для равных объединений, но объединения слиянием более гибкие.
Как правило, если вы объединяете большие объемы данных в равноправном соединении, лучше будет сделать хеш-соединение.
Эта тема очень хорошо освещена в документации.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
12,1 документов: https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm