Обзор удаления
Существует несколько способов удаления данных в ClickHouse, каждый из которых имеет свои преимущества и характеристики производительности. Вы должны выбрать подходящий метод в зависимости от вашей модели данных и объема данных, который вы собираетесь удалить.
Метод | Синтаксис | Когда использовать |
---|---|---|
Легкое удаление | DELETE FROM [table] | Используйте при удалении небольших объемов данных. Строки сразу исключаются из всех последующих запросов SELECT , но изначально просто отмечаются как удаленные, а не удаляются с диска. |
Удаление с помощью мутации | ALTER TABLE [table] DELETE | Используйте, когда данные должны быть немедленно удалены с диска (например, для соблюдения нормативных требований). Отрицательно влияет на производительность SELECT . |
Усечь таблицу | TRUNCATE TABLE [db.table] | Эффективно удаляет все данные из таблицы. |
Удалить партицию | DROP PARTITION | Эффективно удаляет все данные из партиции. |
Вот краткое резюме различных способов удаления данных в ClickHouse:
Легкие удаления
Легкие удаления позволяют строкам быть немедленно отмеченными как удаленные, таким образом они могут быть автоматически исключены из всех последующих запросов SELECT
. Последующее удаление этих удаленных строк происходит во время естественных циклов слияния и, следовательно, требует меньше I/O. В результате возможно, что в течение неопределенного времени данные фактически не удаляются из хранения и только отмечаются как удаленные. Если вам необходимо гарантировать, что данные удалены, рассмотрите вышеупомянутую команду мутации.
Удаление больших объемов данных с помощью легкого оператора DELETE
также может отрицательно сказаться на производительности запросов SELECT
. Команда также несовместима с таблицами с проекциями.
Обратите внимание, что мутация используется в операции для отметки удаленных строк (добавляя колонку _row_exists
), тем самым требуя некоторого I/O.
В целом, легкие удаления должны предпочтаться мутациям, если существование удаленных данных на диске может быть терпимо (например, в случаях, не связанных с соблюдением норм). Этот подход все равно следует избегать, если все данные должны быть удалены.
Читайте больше о легких удалениях.
Удаления с помощью мутаций
Удаления с помощью мутаций могут быть выданы через команду ALTER TABLE … DELETE
, например:
Эти операции могут выполняться либо синхронно (по умолчанию, если не реплицированы), либо асинхронно (определяется настройкой mutations_sync). Эти операции требуют большого объема I/O, переписывая все части, соответствующие выражению WHERE
. Процесс не является атомарным - части заменяются измененными частями, как только они становятся готовыми, и запрос SELECT
, который начинает выполняться во время мутации, будет видеть данные из частей, которые уже были изменены, вместе с данными из частей, которые еще не были изменены. Пользователи могут отслеживать состояние прогресса через таблицу systems.mutations. Эти операции требуют интенсивного I/O и должны использоваться экономно, так как они могут повлиять на производительность SELECT
кластера.
Читайте больше о удалениях с помощью мутаций.
Усечь таблицу
Если все данные в таблице необходимо удалить, используйте команду TRUNCATE TABLE
, показанную ниже. Это легкая операция.
Читайте больше о TRUNCATE TABLE.
Удалить партицию
Если вы указали пользовательский ключ партиционирования для ваших данных, партиции могут быть эффективно удалены. Избегайте партиционирования с высокой кардинальностью.
Читайте больше о DROP PARTITION.