способ соединения наборов строк (join). Набор
строк может быть получен из таблицы с помощью одного их методов доступа, опи-
санных выше. Набор строк может быть получен не только из одной таблицы, а может
быть результатом соединения других наборов. Важно различать способ соединения
таблиц (JOIN) и способ соединения наборов строк. Первое понятие относится к языку
SQL и является высокоуровневым, логическим, оно не касается вопросов реализа-
ции. А второе относится именно к реализации, это — механизм непосредственного
выполнения соединения наборов строк. Принципиально важным является то, что за
один раз соединяются только два набора строк.
Существует три способа соединения: вложенный цикл (nested loop), хеширование
(hash join) и слияние (merge join). Они имеют свои особенности, которые PostgreSQL
учитывает при выполнении конкретных запросов.
Суть способа
«вложенный цикл» в том, что перебираются строки из «внешнего»
набора и для каждой из них выполняется поиск соответствующих строк во «внутрен-
нем» наборе. Если соответствующие строки найдены, то выполняется их соединение
со строкой из «внешнего» набора. При этом способы выбора строк из обоих наборов
могут быть различными. Метод поддерживает соединения как на основе равенства
значений атрибутов (эквисоединения), так и любые другие виды условий. Поскольку
он не требует подготовительных действий, то способен быстро приступить к непо-
средственной выдаче результата. Метод эффективен для небольших выборок.
При
соединении хешированием строки одного набора помещаются в хеш-таблицу,
содержащуюся в памяти, а строки из второго набора перебираются, и для каждой
из них проверяется наличие соответствующих строк в хеш-таблице. Ключом хеш-
таблицы является тот столбец, по которому выполняется соединение наборов строк.
Как правило, число строк в том наборе, на основе которого строится хеш-таблица,
меньше, чем во втором наборе. Это позволяет уменьшить ее размер и ускорить про-
цесс обращения к ней. Данный метод работает только при выполнении эквисоедине-
229
ний, поскольку для хеш-таблицы имеет смысл только проверка на равенство прове-
ряемого значения одному из ее ключей. Метод эффективен для больших выборок.