Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Этот раздел очень хорошо освещен в документации.

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

Ответ 2

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

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

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

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