Перейти к содержанию
Learning Platform
Глоссарий Troubleshooting
Урок 11.07 · 25 мин
Продвинутый
mutationslightweight DELETElightweight UPDATEpartition dropdecision frameworksystem.mutations

Mutations vs Lightweight Ops: сравнение

ClickHouse предлагает четыре механизма изменения данных, каждый с уникальным профилем производительности и ограничениями. Правильный выбор определяет разницу между операцией в миллисекунды и процессом, занимающим часы.


Четыре механизма изменения данных

Механизмы изменения данных: сравнительная матрица
ОперацияЗаголовок: механизм операции
СкоростьСкорость выполнения: от мгновенной до часов
МеханизмВнутренний механизм ClickHouse
ОграниченияОграничения и несовместимости
Use caseТипичный сценарий применения
DROP PARTITIONDROP PARTITION: ALTER TABLE t DROP PARTITION '202312'. Мгновенная операция — просто переименование директории на файловой системе. Никаких сканирований.
O(1) мгновенноO(1): мгновенно независимо от объёма данных в партиции. Самая быстрая операция изменения данных в ClickHouse.
Переименование директорииПереименование директории: ClickHouse переименовывает папку партиции, помечает её как detached или удаляет. Нет I/O операций с данными.
Только целые партицииТолько целые партиции: невозможно удалить часть строк внутри партиции. Нужно PARTITION BY в DDL. Нельзя сделать точечное удаление.
Очистка по датеОчистка по дате: удаление данных старше N месяцев, соответствующих одной партиции. Например: DROP PARTITION '202312' для данных декабря 2023.
DELETE FROMDELETE FROM: DELETE FROM t WHERE expr. Mask-based механизм — создаёт bitmap маску. Строки исчезают из SELECT немедленно, физически удаляются при merge.
O(parts)O(parts): обходит каждую часть для создания маски. Быстро для таблиц с небольшим числом частей. Значительно медленнее DROP PARTITION, но быстрее mutations.
Bitmap-маска на partsBitmap-маска: для каждой части создаётся маска удалённых строк. SELECT автоматически фильтрует по маске. Физическая очистка — при следующем merge или APPLY DELETED MASK.
Нет projectionsНесовместимость с projections: таблицы с projections не поддерживают lightweight DELETE — используйте ALTER TABLE DELETE. Физическое место освобождается только при merge.
GDPR, точечное удалениеGDPR/right-to-be-forgotten: точечное удаление строк конкретного пользователя. Менее 10% строк таблицы. Немедленная видимость через маску.
UPDATEUPDATE: UPDATE t SET col = val WHERE expr. Механизм Patch Parts — создаёт delta-части с обновлёнными значениями. Доступен в ClickHouse 25.7+ / 26.3 LTS.
O(patch) ~1000xO(patch size): создаёт маленький delta-файл. До 1000-1600x быстрее ALTER TABLE UPDATE. Время — миллисекунды для точечных обновлений.
Patch Parts (delta)Patch Parts: создаёт отдельный part только с изменёнными строками. Виден немедленно. Материализуется при merge.
До ~10% строкДо ~10% строк: эффективен для точечных обновлений. При обновлении более 10% строк — используйте ALTER TABLE UPDATE или ETL.
PII-редактированиеPII redaction: маскирование персональных данных для небольшого числа пользователей. GDPR-запросы на исправление. Точечная коррекция данных.
ALTER TABLE UPDATE/DELETEALTER TABLE UPDATE/DELETE: тяжёлые мутации. Полная перезапись затронутых колонок. Асинхронные. Мониторинг через system.mutations.
O(rows x cols) часыO(rows x cols): читает и перезаписывает все затронутые строки и колонки. Для больших таблиц — часы. Асинхронная фоновая операция.
Перезапись колонокПолная перезапись: ClickHouse создаёт новые версии затронутых частей с применёнными изменениями. Старые части удаляются после завершения. system.mutations для мониторинга.
Работает с projectionsЛюбые таблицы: работает с projections, любым объёмом данных. Медленно для точечных изменений. Блокирует некоторые DDL-операции во время выполнения.
Schema migration, backfillSchema migration: массовое обновление колонки. Backfill: заполнение новой колонки значениями на основе существующих. Обновление > 10% строк.

Правило выбора: иерархия операций

DROP PARTITION >> DELETE FROM (lightweight) >> UPDATE (patch parts) >> ALTER TABLE UPDATE/DELETE (mutations)

Выбирайте наиболее быструю операцию, удовлетворяющую требованиям задачи:

-- 1. Можно удалить целую партицию? -> DROP PARTITION (мгновенно)
ALTER TABLE events DROP PARTITION '202312';

-- 2. Нужно удалить < 10% строк, нет projections? -> lightweight DELETE
DELETE FROM events WHERE user_id = 42;

-- 3. Нужно обновить < 10% строк (26.3 LTS)? -> lightweight UPDATE
UPDATE events SET email = 'redacted' WHERE user_id = 42;

-- 4. Всё остальное: projections, > 10% строк -> mutations
ALTER TABLE events UPDATE email = 'redacted' WHERE toDate(event_time) < '2023-01-01';
ALTER TABLE events DELETE WHERE toDate(event_time) < '2023-01-01';

Мониторинг мутаций через system.mutations

system.mutations отслеживает только тяжёлые мутации (ALTER TABLE UPDATE/DELETE). Lightweight DELETE и UPDATE не отображаются в этой таблице.

-- Активные (незавершённые) мутации:
SELECT
    database,
    table,
    mutation_id,
    command,
    parts_to_do,
    parts_done,
    is_done,
    create_time,
    latest_fail_reason
FROM system.mutations
WHERE table = 'events' AND NOT is_done
ORDER BY create_time DESC;

-- Общий прогресс мутации:
SELECT
    mutation_id,
    parts_done * 100.0 / (parts_to_do + parts_done) AS progress_pct
FROM system.mutations
WHERE table = 'events' AND NOT is_done;
WARNING

system.mutations показывает прогресс только для ALTER TABLE UPDATE/DELETE. Lightweight DELETE и lightweight UPDATE (Patch Parts) не регистрируются в system.mutations — они синхронны и не требуют фонового отслеживания.


Отмена и управление мутациями

-- Отмена выполняющейся мутации:
KILL MUTATION WHERE table = 'events' AND mutation_id = 'mutation_1234';

-- Проверка: мутация отменена (is_killed = 1)
SELECT mutation_id, is_done, is_killed
FROM system.mutations
WHERE table = 'events';

-- Синхронное ожидание завершения мутации:
ALTER TABLE events UPDATE ... WHERE ...
SETTINGS mutations_sync = 1;  -- ждать завершения на локальной реплике
-- mutations_sync = 2: ждать на всех репликах

Практические сценарии

Сценарий 1: GDPR — удаление данных пользователя

-- 50 пользователей из 100M → lightweight DELETE
DELETE FROM user_events WHERE user_id IN (SELECT user_id FROM gdpr_requests);

Сценарий 2: ETL cleanup — удаление дублей по дате

-- Целая партиция дублей → DROP PARTITION (мгновенно)
ALTER TABLE staging_events DROP PARTITION '20240115';

Сценарий 3: Schema migration — новая колонка с вычисленным значением

-- Все строки таблицы → mutation (нет другого пути)
ALTER TABLE events UPDATE category = multiIf(
    event_type = 'purchase', 'revenue',
    event_type = 'view', 'engagement',
    'other'
) WHERE true;

Сценарий 4: Data correction — исправление PII для конкретных аккаунтов

-- 200 аккаунтов из 10M, таблица без projections → lightweight UPDATE
UPDATE user_events SET phone = 'MASKED' WHERE user_id IN (...);

Ключевые выводы

  1. Иерархия скорости: DROP PARTITION (O(1)) >> DELETE FROM (O(parts)) >> UPDATE (O(patch)) >> mutations (O(rows)).
  2. ALTER TABLE UPDATE/DELETE — единственный выбор для таблиц с projections и обновления > 10% строк.
  3. system.mutations отслеживает только тяжёлые мутации — lightweight операции там не появляются.
  4. KILL MUTATION + is_killed — механизм отмены выполняющейся мутации.
  5. mutations_sync = 2 ждёт завершения мутации на всех репликах — важно для консистентных схема-миграций.
MVCC в PostgreSQL: версии строк, xmin/xmax и visibility map Batch-обработка: паттерны, окна и гарантии доставки

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 8