В чем разница между хеш-соединением и объединением слиянием (Oracle RDBMS)? - PullRequest
57 голосов
/ 11 июля 2009

Каковы приросты / потери производительности между хеш-соединениями и объединениями слиянием, особенно в Oracle RDBMS?

Ответы [ 2 ]

72 голосов
/ 11 июля 2009

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

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

(В до 10g внешние соединения от большой к маленькой таблице были проблемными с точки зрения производительности, так как оптимизатор не мог решить необходимость доступа к меньшей таблице сначала для хеш-соединения, но большей таблицы - для первой внешнее объединение. Следовательно, в этой ситуации хеш-объединения были недоступны).

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

  1. Размер каждой хеш-таблицы уменьшен, что уменьшает максимальный объем требуемой памяти и потенциально устраняет необходимость в операции, требующей временного дискового пространства.
  2. Для операций с параллельными запросами объем межпроцессного обмена сообщениями значительно сокращается, что снижает загрузку ЦП и повышает производительность, поскольку каждое хеш-соединение может выполняться одной парой процессов PQ.
  3. Для непараллельных операций запроса потребность в памяти уменьшается в 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

7 голосов
/ 11 июля 2009

Я просто хочу отредактировать это для потомков, чтобы теги для оракула не были добавлены, когда я ответил на этот вопрос. Мой ответ был более применим к MS SQL.

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

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

В худшем случае это вложенный цикл, который представляет собой порядок (n * m), что означает отсутствие упорядочения или размера для использования, а объединение просто для каждой строки в таблице x - поиск в таблице y для объединений, которые необходимо выполнить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...