Clickhouse Tricks 3


Менее известные особенности 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 в Кликхаусе. Богатый выбор подходов к использованию при этом подразумевает большую ответственность пользователя, с риском получения исключений в ходе запроса, однако, при этом, дает широкие возможности для тонкой настройки и оптимизации работы запросов.