Passer au contenu principal
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;

┌──────────────────ts─┬─event_type─┬─sum(events_cnt)─┐
2020-01-01 00:00:00 │ click      │              48
2020-01-01 00:00:00 │ imp        │              48
2020-01-02 00:00:00 │ click      │               2
2020-01-02 00:00:00 │ imp        │               2
└─────────────────────┴────────────┴─────────────────┘

-- Let's add the new measurement `cost`
-- and the new dimension `browser`.

ALTER TABLE events
  ADD COLUMN browser String,
  ADD COLUMN cost Float64;

-- Column do not have to match in a materialized view and TO
-- (destination table), so the next alter does not break insertion.

ALTER TABLE events_by_day
    ADD COLUMN cost Float64,
    ADD COLUMN browser String after event_type,
    MODIFY ORDER BY (event_type, ts, browser);

INSERT INTO events
SELECT Date '2020-01-02' + interval number * 900 second,
       ['imp', 'click'][number%2+1],
       ['firefox', 'safary', 'chrome'][number%3+1],
       10/(number+1)%33
FROM numbers(100);

-- New columns `browser` and `cost` are empty because we did not change Materialized View yet.

SELECT ts, event_type, browser, sum(events_cnt) events_cnt, round(sum(cost),2) cost
FROM events_by_day
GROUP BY ts, event_type, browser
ORDER BY ts, event_type;

┌──────────────────ts─┬─event_type─┬─browser─┬─events_cnt─┬─cost─┐
2020-01-01 00:00:00 │ click      │         │         480
2020-01-01 00:00:00 │ imp        │         │         480
2020-01-02 00:00:00 │ click      │         │         500
2020-01-02 00:00:00 │ imp        │         │         500
2020-01-03 00:00:00 │ click      │         │          20
2020-01-03 00:00:00 │ imp        │         │          20
└─────────────────────┴────────────┴─────────┴────────────┴──────┘

ALTER TABLE mv MODIFY QUERY
  SELECT toStartOfDay(ts) ts, event_type, browser,
  count() events_cnt,
  sum(cost) cost
  FROM events
  GROUP BY ts, event_type, browser;

INSERT INTO events
SELECT Date '2020-01-03' + interval number * 900 second,
       ['imp', 'click'][number%2+1],
       ['firefox', 'safary', 'chrome'][number%3+1],
       10/(number+1)%33
FROM numbers(100);

SELECT ts, event_type, browser, sum(events_cnt) events_cnt, round(sum(cost),2) cost
FROM events_by_day
GROUP BY ts, event_type, browser
ORDER BY ts, event_type;

┌──────────────────ts─┬─event_type─┬─browser─┬─events_cnt─┬──cost─┐
2020-01-01 00:00:00 │ click      │         │         480
2020-01-01 00:00:00 │ imp        │         │         480
2020-01-02 00:00:00 │ click      │         │         500
2020-01-02 00:00:00 │ imp        │         │         500
2020-01-03 00:00:00 │ click      │ firefox │         166.84
2020-01-03 00:00:00 │ click      │         │          20
2020-01-03 00:00:00 │ click      │ safary  │         169.82
2020-01-03 00:00:00 │ click      │ chrome  │         165.63
2020-01-03 00:00:00 │ imp        │         │          20
2020-01-03 00:00:00 │ imp        │ firefox │         1615.14
2020-01-03 00:00:00 │ imp        │ safary  │         166.14
2020-01-03 00:00:00 │ imp        │ chrome  │         167.89
2020-01-04 00:00:00 │ click      │ safary  │          10.1
2020-01-04 00:00:00 │ click      │ firefox │          10.1
2020-01-04 00:00:00 │ imp        │ firefox │          10.1
2020-01-04 00:00:00 │ imp        │ chrome  │          10.1
└─────────────────────┴────────────┴─────────┴────────────┴───────┘

-- !!! During `MODIFY ORDER BY` PRIMARY KEY was implicitly introduced.

SHOW CREATE TABLE events_by_day FORMAT TSVRaw

CREATE TABLE test.events_by_day
(
    `ts` DateTime,
    `event_type` String,
    `browser` String,
    `events_cnt` UInt64,
    `cost` Float64
)
ENGINE = SummingMergeTree
PRIMARY KEY (event_type, ts)
ORDER BY (event_type, ts, browser)

-- !!! The columns' definition is unchanged but it does not matter, we are not querying
-- MATERIALIZED VIEW, we are querying TO (storage) table.
-- SELECT section is updated.

SHOW CREATE TABLE mv FORMAT TSVRaw;

CREATE MATERIALIZED VIEW test.mv TO test.events_by_day
(
    `ts` DateTime,
    `event_type` String,
    `events_cnt` UInt64
) AS
SELECT
    toStartOfDay(ts) AS ts,
    event_type,
    browser,
    count() AS events_cnt,
    sum(cost) AS cost
FROM test.events
GROUP BY
    ts,
    event_type,
    browser
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.
-- Change the schedule.
ALTER TABLE rmv MODIFY REFRESH EVERY 30 MINUTE;

-- Change retry settings (schedule must be repeated).
ALTER TABLE rmv MODIFY REFRESH EVERY 1 HOUR
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.
Dernière modification le 25 juin 2026