Менее известные особенности Clickhouse. Часть 3
В этом посте, остановимся на рассмотрении того, как использовать JOIN
ы в Кликхаусе.
Синтаксис
Поддерживается стандарнтый набор джойнов: LEFT, RIGHT, CROSS. В этом плане у Clickhouse
нет отличий от классических SQL БД. Таже поддерживается использование нескольких ключей в ON
или OR
.
Алгоритмы выполнения
Для эффективного использования на большим объемах данных, под которое заточен Кликхаус, имеется целых 6 алгоритмов выполнения JOIN
.
- hash
- parallel hash
- grace hash
- partial merge
- full sorting merge
- direct
Для выбора используемого алгоритма, его достаточно указать вконце запроса в секции SETTINGS
:
SELECT *
FROM sales AS s
JOIN managers m ON s.manager_id = m.manager_id
SETTINGS join_algorithm = 'hash'
Вкратце рассмотрим подробнее все эти варианты
Hash алгоритмы
- hash: создает единственную таблицу в памяти
- parallel hash - разделяет данные на секции (buckets) и параллельно создает в памяти несколько таблиц
- grace hash - по механизму работы, схож с предыдущим, однако при надостатке памяти способен временно использовать дисковое пространство и создавать большее число таблиц.
Важно - в памяти создается таблица справа. Во время джойна таблица слева присоединяется через лукапы с хэш-таблицей. По этой причине, желательно помещать меньщую таблицу справа. Первые два алгоритма завязаны на объем оперативной памяти базы, и при превышении лимита вызовую исключение.
Sort-merge алгоритмы
- full_sorting_merge: обе таблицы сортируются перед джойном (классический пример алгоритма
sort-merge
) - partial_merge: только правая таблица сортируется перед джойном.
Сортировка таблицы присходит при этом в памяти, однако, если её недостаточно, данные могут сгружаться на диск. full_sorting_merge по производительности лишь немного уступает классическому hash алгоритму, при этом не приводит к исключению при превышении по RAM.
Direct алгоритмы
Особое семейство алгоритмов, относящихся к джойнам с особыми таблицами, которые полностью хранятся в памяти БД. К таким относятся:
- Словари (Dictionary
- Таблицы, созданные при помощи Join движка
- EmbededRockDB таблицы (rocksdb таблицы)
Direct алгоритм будет использован, если справа джойнится таблица одного из перечисленных выше типов. Такие джойны очень по производительности даже могут превышать hash-алгоритмы, при этом гораздо менее агрессивно используют память БД.
Какой алгоритм стоит использовать?
Если какой-то конкретный запрос с JOINом происходит часто, имеет смысл по возможности поместить правую таблицу полностью в память RAM как Словарь или JOIN Engine
таблицу. Используемый при этом direct алгоритм наиболее быстрый и оптимизированный по сравнению со всеми прочими.
Если такой возможности нет, стоит рассмотреть использование hash-алгоритмов, но только при условии, что правая таблица может полностью поместиться в память при JOINе. Если имеется риск переиспользования RAM, стоит рассмотреть grace hash
алгоритм или алгоритмы с сортировкой.
Если джойн происходит по сортированным ключам, то, возможно, более подходящим вариантом будет full_sorting_merge
алгоритм.
Заключение
В этой части мы познакомили читателя с использованием JOIN
в Кликхаусе. Богатый выбор подходов к использованию при этом подразумевает большую ответственность пользователя, с риском получения исключений в ходе запроса, однако, при этом, дает широкие возможности для тонкой настройки и оптимизации работы запросов.