Операции с партициями
Партиция в ClickHouse — это логическая группа parts с одинаковым значением ключа партиционирования. Операции на уровне партиций работают с целыми группами parts атомарно, что делает их значительно быстрее поострочных операций и мутаций.
Обзор операций
DETACH PARTITION: временное отключение
DETACH PARTITION перемещает файлы партиции в директорию detached/ внутри хранилища таблицы. Партиция перестаёт участвовать в SELECT-запросах, но физически данные остаются на диске.
-- Отключить партицию за январь 2024
ALTER TABLE events DETACH PARTITION '202401';
-- Проверить, что данные ушли в detached/
SELECT partition_id, name, path
FROM system.detached_parts
WHERE table = 'events';
-- Файлы находятся в data/<database>/events/detached/
Типичные сценарии для DETACH:
- Временное скрытие партиции без удаления (для тестирования)
- Подготовка партиции к ручному переносу между серверами
- Изоляция проблемной партиции от SELECT без потери данных
ATTACH PARTITION: повторное подключение
-- Подключить обратно из detached/
ALTER TABLE events ATTACH PARTITION '202401';
-- ATTACH также работает для загрузки данных, скопированных вручную:
-- 1. Скопируйте files в data/<db>/events/detached/my_partition/
-- 2. ALTER TABLE events ATTACH PARTITION '202401'
MOVE PARTITION: перемещение между таблицами
MOVE PARTITION атомарно переносит партицию из одной таблицы в другую. Обе таблицы должны находиться на одном сервере и иметь идентичный ORDER BY.
-- Архивирование: перенести старые данные в archive-таблицу
ALTER TABLE events MOVE PARTITION '202312' TO TABLE events_archive;
-- После MOVE партиция исчезает из events и появляется в events_archive
SELECT count() FROM events WHERE toYYYYMM(event_time) = 202312; -- 0
SELECT count() FROM events_archive WHERE toYYYYMM(event_time) = 202312; -- данные здесь
MOVE PARTITION требует, чтобы обе таблицы имели идентичный ORDER BY. Если ключи сортировки различаются, операция завершится ошибкой. Это одна из самых частых причин сбоя MOVE PARTITION.
REPLACE PARTITION: атомарная замена данных
REPLACE PARTITION атомарно заменяет содержимое партиции в целевой таблице данными из исходной таблицы. Это атомарная операция без downtime — запросы к целевой таблице не прерываются.
-- Обновить данные за январь 2024 из staging-таблицы
-- (staging_events содержит исправленные данные)
ALTER TABLE events REPLACE PARTITION '202401' FROM staging_events;
-- Атомарность: в момент REPLACE старая партиция заменяется новой мгновенно
-- Запросы видят либо старые данные, либо новые — промежуточного состояния нет
Паттерн использования: ETL-pipeline с промежуточной таблицей. Данные загружаются в staging, трансформируются, затем атомарно заменяют партицию в production-таблице.
FETCH PARTITION: загрузка с реплики
FETCH PARTITION загружает партицию с конкретной реплики через путь в Keeper. Используется при ручном восстановлении реплики или первичном наполнении нового узла.
-- Загрузить партицию '202401' с другой реплики
-- zookeeper_path — путь к таблице в Keeper
ALTER TABLE events
FETCH PARTITION '202401'
FROM '/clickhouse/tables/01/db/events';
-- После FETCH партиция попадает в detached/ -- нужно выполнить ATTACH
ALTER TABLE events ATTACH PARTITION '202401';
DROP PARTITION: самый быстрый способ удаления
DROP PARTITION немедленно удаляет все данные партиции. Это O(1) операция: ClickHouse переименовывает директорию parts партиции, делая их невидимыми, и физически удаляет файлы в фоне.
-- Удалить все данные за декабрь 2023
ALTER TABLE events DROP PARTITION '202312';
-- Множественные партиции
ALTER TABLE events DROP PARTITION ID '202310'; -- по partition_id
ALTER TABLE events DROP PARTITION '202311';
Скорость операций удаления данных:
DROP PARTITION >> lightweight DELETE >> ALTER TABLE DELETE (mutation)
- DROP PARTITION: мгновенно, O(1), независимо от объёма данных
- lightweight DELETE: маска над parts, O(parts), данные фильтруются при чтении
- ALTER TABLE DELETE: полная перезапись затронутых колонок, O(строки * колонки), асинхронно
Если нужно удалить данные за конкретный временной период и таблица партиционирована по времени — DROP PARTITION всегда предпочтительнее.
Практические примеры: проверка через system.parts
-- Перед операциями: посмотреть партиции таблицы
SELECT
partition,
partition_id,
count() AS parts_count,
sum(rows) AS total_rows,
formatReadableSize(sum(bytes_on_disk)) AS disk_size
FROM system.parts
WHERE table = 'events'
AND active
GROUP BY partition, partition_id
ORDER BY partition;
-- После DETACH: партиция видна только в system.detached_parts
SELECT name, partition_id, disk
FROM system.detached_parts
WHERE table = 'events';
Ключевые выводы
- DETACH PARTITION перемещает файлы в
detached/— партиция скрыта для SELECT, но данные не удалены; ATTACH возвращает её обратно. - MOVE PARTITION переносит партицию между таблицами атомарно; обе таблицы должны иметь идентичный ORDER BY.
- REPLACE PARTITION атомарно заменяет данные партиции из исходной таблицы — операция без downtime, запросы не прерываются.
- FETCH PARTITION загружает партицию с другой реплики через Keeper; после FETCH нужен ATTACH для активации.
- DROP PARTITION — самый быстрый способ удаления: O(1) независимо от объёма. Для bulk-удаления данных за период всегда предпочтительнее мутаций.