Ответ 1
Соединение "сортировка сортировки" выполняется путем сортировки двух наборов данных, которые должны быть объединены в соответствии с ключами соединения, а затем слияния их. Слияние очень дешево, но сортировка может быть непомерно дорогостоящей, особенно если сортировка разливается на диск. Стоимость сортировки может быть снижена, если один из наборов данных можно получить в отсортированном порядке по индексу, хотя доступ к большому количеству блоков таблицы посредством сканирования индекса также может быть очень дорогим по сравнению с полным сканированием таблицы.
Хеш-соединение выполняется путем хеширования одного набора данных в память на основе столбцов соединения и чтения другого и проверки хэш-таблицы для совпадений. Хеш-соединение очень низкое, когда хэш-таблица может храниться полностью в памяти, при этом общая стоимость составляет очень немного больше, чем стоимость чтения наборов данных. Стоимость возрастает, если хэш-таблица должна быть разлита на диск в однопроходной сортировке и значительно возрастает для многопроходной сортировки.
Стоимость хэш-соединения может быть уменьшена путем разбиения обеих таблиц на ключ соединения. Это позволяет оптимизатору вывести, что строки из раздела в одной таблице будут находить совпадение только в определенном разделе другой таблицы, а для таблиц, имеющих n разделов, хеш-соединение выполняется как n независимых хеш-соединений. Это имеет следующие эффекты:
- Размер каждой хеш-таблицы уменьшается, следовательно, уменьшается максимальный объем требуемой памяти и потенциально устраняется необходимость временного дискового пространства для операции.
- Для операций с параллельными запросами объем обмена сообщениями между процессами значительно сокращается, уменьшая использование ЦП и повышая производительность, поскольку каждое хеш-соединение может выполняться одной парой процессов PQ.
- Для непараллельных операций запроса требование памяти уменьшается в n раз, а первые строки проецируются из запроса ранее.
Следует отметить, что хеш-соединения могут использоваться только для equi-join, но объединения слияния более гибкие.
В общем, если вы присоединяетесь к большому количеству данных в equi-join, тогда хеш-соединение будет лучше.
Этот раздел очень хорошо освещен в документации.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523