ClickHouse: удалить строки по условию
Для удаления выбранных строк в таблицах семейства MergeTree используется DELETE FROM … WHERE. Сначала проверьте тем же условием, какие строки попадут под удаление. USE выбирает базу данных, а не таблицу: таблицу удобнее указать полным именем.
Проверить таблицу и условие
SELECT version();
SHOW CREATE TABLE analytics.events;
SELECT count()
FROM analytics.events
WHERE status = 'inactive';
SELECT *
FROM analytics.events
WHERE status = 'inactive'
LIMIT 20;Здесь analytics.events — пример имени уже существующей таблицы, а status — её столбец. Подставляйте свои имена только после проверки схемы. Счётчик и выборка нужны до удаления; одна лишь строка «запрос выполнен» не подтверждает правильность условия.
Удалить выбранные строки
DELETE FROM analytics.events
WHERE status = 'inactive';Это lightweight delete. Поддержка зависит от движка, версии и особенностей таблицы, включая projections. Строки сначала помечаются удалёнными; физическое освобождение места происходит при последующих слияниях. Настройки синхронности влияют на момент завершения команды, поэтому повторный SELECT проверяйте после завершения соответствующей операции.
Очистить всю таблицу — отдельная задача
TRUNCATE TABLE analytics.events;TRUNCATE удаляет всё содержимое, сохраняя саму таблицу. Не используйте его вместо ошибочного WHERE. Перед любой командой удаления нужны проверенная резервная копия или иной план восстановления; обычного отката транзакции для этих действий здесь не предполагается.
Проверить результат и нагрузку
- Повторите SELECT count() с исходным условием и проверьте несколько строк, которые должны были остаться.
- Для больших объёмов оцените нагрузку на тестовой копии: удаление может влиять на запросы и очередь mutations.
- Не заменяйте DELETE на ALTER TABLE … DELETE автоматически: это более тяжёлая операция с иными затратами.
- Ноль видимых строк не означает, что данные уже исчезли из всех файлов, реплик и резервных копий.