Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ALTER TABLE ... MODIFY QUERY

Vous pouvez modifier la requête SELECT spécifiée lors de la création d’une vue matérialisée à l’aide de l’instruction ALTER TABLE ... MODIFY QUERY, sans interrompre le processus d’ingestion.

Cette commande permet de modifier une vue matérialisée créée avec la clause TO [db.]name. Elle ne modifie ni la structure de la table de stockage sous-jacente, ni la définition des colonnes de la vue matérialisée. Son utilisation est donc très limitée pour les vues matérialisées créées sans la clause TO [db.]name.

Exemple avec une table TO

CREATE TABLE events (ts DateTime, event_type String)
ENGINE = MergeTree ORDER BY (event_type, ts);

CREATE TABLE events_by_day (ts DateTime, event_type String, events_cnt UInt64)
ENGINE = SummingMergeTree ORDER BY (event_type, ts);

CREATE MATERIALIZED VIEW mv TO events_by_day AS
SELECT toStartOfDay(ts) ts, event_type, count() events_cnt
FROM events
GROUP BY ts, event_type;

INSERT INTO events
SELECT DATE '2020-01-01' + interval number * 900 second,
       ['imp', 'click'][number%2+1]
FROM numbers(100);

SELECT ts, event_type, sum(events_cnt)
FROM events_by_day
GROUP BY ts, event_type
ORDER BY ts, event_type;

Exemple sans table TO

L’application est très limitée, car vous ne pouvez modifier que la clause SELECT, sans pouvoir ajouter de nouvelles colonnes.

CREATE TABLE src_table (`a` UInt32) ENGINE = MergeTree ORDER BY a;
CREATE MATERIALIZED VIEW mv (`a` UInt32) ENGINE = MergeTree ORDER BY a AS SELECT a FROM src_table;
INSERT INTO src_table (a) VALUES (1), (2);
SELECT * FROM mv;
┌─a─┐
│ 1 │
│ 2 │
└───┘
ALTER TABLE mv MODIFY QUERY SELECT a * 2 as a FROM src_table;
INSERT INTO src_table (a) VALUES (3), (4);
SELECT * FROM mv;
┌─a─┐
│ 6 │
│ 8 │
└───┘
┌─a─┐
│ 1 │
│ 2 │
└───┘

Instruction ALTER TABLE … MODIFY REFRESH

ALTER TABLE ... MODIFY REFRESH modifie les paramètres de rafraîchissement d'une vue matérialisée rafraîchissable, notamment la planification, les dépendances, l'aléa et les paramètres de rafraîchissement.

ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...]

La planification (EVERY ou AFTER) est obligatoire : l’instruction remplace tous les paramètres d’actualisation d’un seul coup. Toute clause non spécifiée — RANDOMIZE FOR, DEPENDS ON ou SETTINGS — est supprimée ou réinitialisée à sa valeur par défaut. Pour modifier uniquement les paramètres d’actualisation, répétez la planification actuelle.

La commande met à jour sur place la configuration de rafraîchissement de la vue existante, sans recréer la vue matérialisée ni sa table cible, sans effacer les données cibles existantes ni annuler un rafraîchissement déjà en cours. Les lectures continuent de s’effectuer sur la table cible existante pendant la modification de la configuration.

Vous pouvez répéter sans risque la commande avec la même spécification REFRESH complète. Veillez à répéter chaque clause qui doit rester configurée, car chaque exécution remplace tous les paramètres de rafraîchissement comme décrit ci-dessus.

-- Change the schedule.
ALTER TABLE rmv MODIFY REFRESH EVERY 30 MINUTE;

-- Change retry settings (schedule must be repeated).
ALTER TABLE rmv MODIFY REFRESH EVERY 30 MINUTE
SETTINGS refresh_retries = 5,
         refresh_retry_initial_backoff_ms = 500,
         refresh_retry_max_backoff_ms = 60000;

-- Add or keep a dependency.
ALTER TABLE rmv MODIFY REFRESH EVERY 6 HOUR DEPENDS ON other_rmv;

-- Drop the dependency by omitting `DEPENDS ON`.
ALTER TABLE rmv MODIFY REFRESH EVERY 6 HOUR;

Limites :

  • ALTER TABLE ... MODIFY SETTING n’est pas pris en charge pour les vues matérialisées ; les paramètres de rafraîchissement ne peuvent être modifiés que via MODIFY REFRESH.
  • L’ajout ou la suppression de APPEND n’est pas pris en charge.
  • Le paramètre de rafraîchissement all_replicas ne peut pas être modifié après la création de la vue.

La liste complète des paramètres de rafraîchissement est documentée dans Paramètres de rafraîchissement. L’état du rafraîchissement, y compris les paramètres actuellement appliqués, est visible dans system.view_refreshes.

Navigation