ALTER
Большинство запросов ALTER TABLE изменяют настройки или данные таблицы:
| Модификатор |
|---|
| COLUMN |
| PARTITION |
| DELETE |
| UPDATE |
| ORDER BY |
| INDEX |
| CONSTRAINT |
| TTL |
| STATISTICS |
| APPLY DELETED MASK |
Большинство запросов ALTER TABLE поддерживается только для *MergeTree, Merge и Distributed таблиц.
Эти операторы ALTER управляют представлениями:
| Оператор | Описание |
|---|---|
| ALTER TABLE ... MODIFY QUERY | Изменяет структуру Материализованного представления. |
| ALTER LIVE VIEW | Обновляет Live представление. |
Эти операторы ALTER изменяют сущности, связанные с контролем доступа на основе ролей:
| Оператор |
|---|
| USER |
| ROLE |
| QUOTA |
| ROW POLICY |
| SETTINGS PROFILE |
| Оператор | Описание |
|---|---|
| ALTER TABLE ... MODIFY COMMENT | Добавляет, изменяет или удаляет комментарии к таблице, независимо от того, были ли они установлены ранее или нет. |
| ALTER NAMED COLLECTION | Изменяет Именованные Коллекции. |
Мутации
Запросы ALTER, которые предназначены для изменения данных таблицы, реализованы с помощью механизма, называемого "мутациями", наиболее заметными являются ALTER TABLE ... DELETE и ALTER TABLE ... UPDATE. Они выполняются асинхронно в фоновом режиме и аналогичны слияниям в таблицах MergeTree, которые предназначены для создания новых "мутизированных" версий частей данных.
Для таблиц *MergeTree мутации выполняются путем перезаписи целых частей данных.
Отсутствует атомарность — части заменяются мутизированными частями сразу, как только они готовы, и запрос SELECT, который начал выполняться во время мутации, будет видеть данные из частей, которые уже были мутизированы, вместе с данными из частей, которые еще не были мутизированы.
Мутации полностью упорядочены по порядку их создания и применяются к каждой части в этом порядке. Мутации также частично упорядочены с запросами INSERT INTO: данные, которые были вставлены в таблицу до отправки мутации, будут мутизированы, а данные, которые были вставлены после этого, мутизированы не будут. Обратите внимание, что мутации не блокируют вставки.
Запрос мутации возвращает управление сразу после добавления записи о мутации (в случае реплицированных таблиц в ZooKeeper, для нереплицированных таблиц - в файловую систему). Сама мутация выполняется асинхронно, используя настройки системного профиля. Чтобы отслеживать прогресс мутаций, вы можете использовать таблицу system.mutations. Мутация, которая была успешно отправлена, продолжит выполняться даже если серверы ClickHouse будут перезапущены. Невозможно отменить мутацию после ее отправки, но если мутация застряла по какой-то причине, ее можно отменить с помощью запроса KILL MUTATION.
Записи о завершенных мутациях не удаляются сразу (количество сохраняемых записей определяется параметром движка хранения finished_mutations_to_keep). Более старые записи о мутациях удаляются.
Синхронность запросов ALTER
Для нереплицированных таблиц все запросы ALTER выполняются синхронно. Для реплицированных таблиц запрос просто добавляет инструкции для соответствующих действий в ZooKeeper, а сами действия выполняются как можно скорее. Тем не менее, запрос может ждать завершения этих действий на всех репликах.
Для запросов ALTER, которые создают мутации (например: включая, но не ограничиваясь, UPDATE, DELETE, MATERIALIZE INDEX, MATERIALIZE PROJECTION, MATERIALIZE COLUMN, APPLY DELETED MASK, CLEAR STATISTIC, MATERIALIZE STATISTIC), синхронность определяется настройкой mutations_sync.
Для других запросов ALTER, которые только изменяют метаданные, вы можете использовать настройку alter_sync для настройки ожидания.
Вы можете указать, сколько времени (в секундах) ждать, пока неактивные реплики выполнят все запросы ALTER, с помощью настройки replication_wait_for_inactive_replica_timeout.
Для всех запросов ALTER, если alter_sync = 2 и некоторые реплики неактивны более чем в течение времени, указанного в настройке replication_wait_for_inactive_replica_timeout, то будет вызвано исключение UNFINISHED.