Оптимизация соединения хешированием (hash join) в SQL

Как известно, основными операциями соединения (join) в СУБД, работающей с SQL, являются вложенные циклы (nested loops), операции соединения хешированием (hash joins) и операции сортировки с объединением. Они применяются для всех запросов, содержащих JOIN.

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

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

Как можно помочь СУБД с соединением хешированием:

  1. Можно создать индекс для независмых предикатов (условий в WHERE, которых нет в ON). Порядок следования таблиц в JOIN не имеет значения при этом. Индексы для условий соединения таблиц (в ON) не имеют никакого смысла, так как используется хеш-таблица.
  2. Уменьшить размер хеш-таблицы путем выборки меньшего количество столбцов (уменьшает нагрузку на память) и путем добавления большего числа ограничений в ON, даже если они «не делают погоды» в логике запроса — это также уменьшить количество строк в хеш-таблице.

Надо помнить еще о том, что соединение хешированием не может применяться, если в ON есть условия, отличающиеся от равенства (например, больше, меньше и т.п.)

Практически всё то же самое в плане оптимизации характерно и для слияния с сортировкой (sort-merge join). Сама эта операция требует очень мало времени (так как по сути идет просто «склейка» двух отсортированных таблиц по принципу наподобие замка с молнией), но обе таблицы должны быть отсортированы, так что она применяется достаточно редко.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.