В чем разница между хэш-соединением и объединением слиянием (Oracle RDBMS?



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

769   2  

2 ответов:

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

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

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

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

  1. размер каждой хэш-таблицы уменьшается, следовательно, уменьшая максимальный объем требуемой памяти и потенциально устраняя необходимость в операции, требующей временного дискового пространства.
  2. для параллельных операций запроса количество межпроцессных сообщений значительно сокращается, уменьшая использование ЦП и улучшая производительность, так как каждое хэш-соединение может выполняться одной парой процессов PQ.
  3. для непараллельных операций запроса потребность в памяти уменьшается в n раз, и первые строки проецируются из запроса ранее.

следует отметить, что хэш-соединения могут использоваться только для equi-соединений, но объединения слиянием являются более гибкими.

В общем, если вы соединяете большие объемы данных в equi-join, то хэш-соединение будет лучше ставка.

эта тема очень хорошо описана в документации.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

12.1 docs:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm

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

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

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

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

Comments

    Ничего не найдено.