Puede modificar la consulta SELECT especificada al crear una vista materializada con la sentencia ALTER TABLE ... MODIFY QUERY sin interrumpir el proceso de ingestión.
Este comando está pensado para modificar una vista materializada creada con la cláusula TO [db.]name. No cambia la estructura de la tabla de almacenamiento subyacente ni la definición de las columnas de la vista materializada; por ello, el uso de este comando es muy limitado en las vistas materializadas creadas sin la cláusula TO [db.]name.
Ejemplo con tabla 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;
┌Ejemplo sin tabla TO
La aplicación es muy limitada porque solo se puede cambiar la sección SELECT sin añadir columnas nuevas.
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 │
└───┘Sentencia ALTER TABLE … MODIFY REFRESH
ALTER TABLE ... MODIFY REFRESH cambia los parámetros de actualización de una vista materializada actualizable, incluidos la programación, las dependencias, la aleatorización y la configuración de actualización.
ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...]La programación (EVERY o AFTER) es obligatoria: la sentencia reemplaza todos los parámetros de actualización de una vez. Cualquier cláusula no especificada — RANDOMIZE FOR, DEPENDS ON o SETTINGS — se elimina o se restablece a sus valores predeterminados. Para cambiar solo la configuración de actualización, repita la programación actual.
El comando actualiza directamente la configuración de actualización de la vista existente sin volver a crear la vista materializada ni su tabla de destino, borrar los datos existentes de destino ni cancelar una actualización que ya esté en ejecución. Las lecturas continúan en la tabla de destino existente mientras se cambia la configuración.
Es seguro repetir el comando con la misma especificación REFRESH completa. Asegúrese de repetir cada cláusula que deba permanecer configurada, porque cada ejecución reemplaza todos los parámetros de actualización como se describió anteriormente.
-- 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;Limitaciones:
ALTER TABLE ... MODIFY SETTINGno se admite en las vistas materializadas; la configuración de actualización solo puede modificarse medianteMODIFY REFRESH.- No se admite agregar ni quitar
APPEND. - La configuración de actualización
all_replicasno puede cambiarse después de crear la vista.
La lista completa de la configuración de actualización está documentada en Configuración de actualización. El estado de actualización, incluida la configuración aplicada actualmente, puede verse en system.view_refreshes.