Перейти к основному содержимому
Перейти к основному содержимому

Обновление и удаление данных ClickHouse

Хотя ClickHouse предназначен для работы с аналитическими нагрузками высокого объема, в некоторых ситуациях возможно изменить или удалить существующие данные. Эти операции обозначаются как "мутации" и выполняются с помощью команды ALTER TABLE. Вы также можете DELETE строку, используя легковесную возможность удаления ClickHouse.

подсказка

Если вам нужно выполнять частые обновления, рассмотрите возможность использования дедупликации в ClickHouse, которая позволяет обновлять и/или удалять строки без генерации события мутации.

Обновление данных

Используйте команду ALTER TABLE...UPDATE, чтобы обновить строки в таблице:

ALTER TABLE [<database>.]<table> UPDATE <column> = <expression> WHERE <filter_expr>

<expression> — это новое значение для колонки, где выполнено условие <filter_expr>. <expression> должен иметь тот же тип данных, что и колонка, или быть преобразуемым к тому же типу с помощью оператора CAST. <filter_expr> должен возвращать значение UInt8 (нулевое или ненулевое) для каждой строки данных. Несколько операторов UPDATE <column> могут быть объединены в одной команде ALTER TABLE, разделенные запятыми.

Примеры:

  1. Мутация, как эта, позволяет обновлять, заменяя visitor_ids новыми с помощью обращения к словарю:

    ALTER TABLE website.clicks
    UPDATE visitor_id = getDict('visitors', 'new_visitor_id', visitor_id)
    WHERE visit_date < '2022-01-01'
    
  2. Изменение нескольких значений в одной команде может быть более эффективно, чем несколько команд:

    ALTER TABLE website.clicks
    UPDATE url = substring(url, position(url, '://') + 3), visitor_id = new_visit_id
    WHERE visit_date < '2022-01-01'
    
  3. Мутации могут выполняться ON CLUSTER для шардированных таблиц:

    ALTER TABLE clicks ON CLUSTER main_cluster
    UPDATE click_count = click_count / 2
    WHERE visitor_id ILIKE '%robot%'
    
примечание

Невозможно обновлять колонки, которые являются частью первичного или сортировочного ключа.

Удаление данных

Используйте команду ALTER TABLE, чтобы удалять строки:

ALTER TABLE [<database>.]<table> DELETE WHERE <filter_expr>

<filter_expr> должен возвращать значение UInt8 для каждой строки данных.

Примеры

  1. Удалите любые записи, где колонка входит в массив значений:

    ALTER TABLE website.clicks DELETE WHERE visitor_id in (253, 1002, 4277)
    
  2. Каковы изменения в этом запросе?

    ALTER TABLE clicks ON CLUSTER main_cluster DELETE WHERE visit_date < '2022-01-02 15:00:00' AND page_id = '573'
    
примечание

Чтобы удалить все данные из таблицы, более эффективно использовать команду TRUNCATE TABLE [<database].]<table>. Эта команда также может быть выполнена ON CLUSTER.

Смотрите страницу документации по DELETE statement для получения дополнительной информации.

Легковесные удаления

Другой вариант удаления строк — использование команды DELETE FROM, которая называется легковесным удалением. Удаленные строки немедленно помечаются как удаленные и автоматически будут отфильтрованы из всех последующих запросов, поэтому вам не нужно ждать слияния частей или использовать ключевое слово FINAL. Очистка данных происходит асинхронно в фоновом режиме.

DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr]

Например, следующий запрос удаляет все строки из таблицы hits, где колонка Title содержит текст hello:

DELETE FROM hits WHERE Title LIKE '%hello%';

Несколько заметок о легковесных удалениях:

  • Эта функция доступна только для семейства движков таблиц MergeTree.
  • Легковесные удаления по умолчанию являются асинхронными. Установите mutations_sync равным 1, чтобы дождаться обработки оператора одной репликой, и установите mutations_sync равным 2, чтобы дождаться обработки всеми репликами.