В большинстве случаев ключ партиционирования не нужен, а если и нужен, то обычно достаточно партиционирования по месяцам — кроме сценариев обсервабилити, где часто используется партиционирование по дням.Никогда не используйте слишком мелкое партиционирование. Не разбивайте данные на партиции по идентификаторам или именам клиентов. Вместо этого сделайте идентификатор или имя клиента первым столбцом в выражении ORDER BY.
PARTITION BY expr при создании таблицы. Ключ партиционирования может быть любым выражением на основе столбцов таблицы. Например, чтобы задать партиционирование по месяцам, используйте выражение toYYYYMM(date_column):
Слияние работает только для частей данных с одинаковым значением выражения партиционирования. Это означает, что не следует создавать слишком мелкие партиции (например, более тысячи партиций). Иначе запрос
SELECT будет выполняться медленно из-за неоправданно большого числа файлов в файловой системе и открытых файловых дескрипторов.visits с партиционированием по месяцам. Выполним запрос SELECT к таблице system.parts:
partition содержит имена партиций. В этом примере есть две партиции: 201901 и 201902. Значение этого столбца можно использовать, чтобы указать имя партиции в запросах ALTER … PARTITION.
Столбец name содержит имена частей данных партиции. Этот столбец можно использовать, чтобы указать имя части в запросе ALTER ATTACH PART.
Разберем имя части: 201901_1_9_2_11:
201901— это имя партиции.1— это минимальный номер блока данных.9— это максимальный номер блока данных.2— это уровень фрагмента (глубина дерева слияния, из которого он образован).11— это версия мутации (если к части была применена мутация)
Части таблиц старого типа имеют следующее имя:
20190117_20190123_2_2_0 (минимальная дата - максимальная дата - минимальный номер блока - максимальный номер блока - уровень).active показывает статус части. 1 — активна; 0 — неактивна. Неактивные части — это, например, исходные части, оставшиеся после слияния в более крупную часть. Поврежденные части данных также помечаются как неактивные.
Как видно из примера, есть несколько отдельных частей одной и той же партиции (например, 201901_1_3_1 и 201901_1_9_2). Это означает, что эти части еще не слиты. ClickHouse периодически сливает вставленные части данных, примерно через 15 минут после вставки. Кроме того, вы можете выполнить внеплановое слияние с помощью запроса OPTIMIZE. Пример:
/var/lib/clickhouse/data/<database>/<table>/. Например:
detached содержит части, которые были отсоединены от таблицы с помощью запроса DETACH. Повреждённые части также перемещаются в этот каталог вместо удаления. Сервер не использует части из каталога detached. Вы можете в любой момент добавлять, удалять или изменять данные в этом каталоге — сервер не узнает об этом, пока вы не выполните запрос ATTACH.
Обратите внимание, что на работающем сервере нельзя вручную изменять состав частей или их данные в файловой системе, поскольку сервер об этом не узнает. Для нереплицируемых таблиц это можно сделать, когда сервер остановлен, но это не рекомендуется. Для реплицируемых таблиц состав частей нельзя изменять ни при каких обстоятельствах.
ClickHouse позволяет выполнять операции с партициями: удалять их, копировать из одной таблицы в другую или создавать резервную копию. Список всех операций см. в разделе Манипуляции с партициями и частями.
Оптимизация Group By с использованием ключа партиционирования
Производительность такого запроса зависит от структуры таблицы. Начиная с версии 26.7 эта оптимизация включена по умолчанию; эвристики времени выполнения автоматически отключают её, когда структура партиций неблагоприятна — в частности, когда партиций слишком мало (меньше
max_threads / 2), слишком много (больше max_number_of_partitions_for_independent_aggregation) или размеры партиций сильно перекошены (самая большая партиция содержит больше строк, чем удвоенное общее число строк, делённое на max_threads). В списке ниже описаны факторы структуры, важные для хорошей производительности в целом; из них эвристики времени выполнения учитывают только число партиций и перекос размеров.- число партиций, задействованных в запросе, должно быть достаточно большим (более
max_threads / 2), иначе запрос не будет в полной мере использовать ресурсы машины - партиции не должны быть слишком маленькими, чтобы батчевая обработка не выродилась в построчную
- партиции должны быть сопоставимы по размеру, чтобы все потоки выполняли примерно одинаковый объём работы
Рекомендуется применять какую-либо хеш-функцию к столбцам в выражении
partition by, чтобы равномерно распределить данные между партициями.allow_aggregate_partitions_independently- управляет тем, включено ли использование этой оптимизацииforce_aggregate_partitions_independently- принудительно включает её использование, когда это допустимо с точки зрения корректности, но она отключается внутренней логикой, оценивающей целесообразность её примененияmax_number_of_partitions_for_independent_aggregation- жёсткое ограничение на максимальное число партиций, которое может быть у таблицы