메인 콘텐츠로 건너뛰기
수집 과정을 중단하지 않고도, materialized view를 생성할 때 지정한 SELECT 쿼리를 ALTER TABLE ... MODIFY QUERY 문으로 수정할 수 있습니다. 이 명령은 TO [db.]name 절로 생성된 materialized view를 변경하기 위해 설계되었습니다. 이 명령은 기반 저장소 테이블의 구조를 변경하지 않으며, materialized view의 컬럼 정의도 변경하지 않습니다. 따라서 TO [db.]name 절 없이 생성된 materialized view에는 이 명령을 적용할 수 있는 경우가 매우 제한적입니다. 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
└─────────────────────┴────────────┴─────────────────┘

-- 새로운 측정값 `cost`와
-- 새로운 차원 `browser`를 추가합니다.

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

-- materialized view와 TO (대상 테이블)의 컬럼이 일치하지 않아도 되므로,
-- 다음 ALTER를 실행해도 삽입이 중단되지 않습니다.

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);

-- 아직 Materialized View를 변경하지 않았으므로 새 컬럼 `browser`와 `cost`는 비어 있습니다.

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
└─────────────────────┴────────────┴─────────┴────────────┴───────┘

-- !!! `MODIFY ORDER BY` 실행 시 PRIMARY KEY가 암묵적으로 설정되었습니다.

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)

-- !!! 컬럼 정의는 변경되지 않았지만 문제없습니다. MATERIALIZED VIEW를 직접 쿼리하는 것이 아니라
-- TO (스토리지) 테이블을 쿼리하기 때문입니다.
-- SELECT 섹션이 업데이트되었습니다.

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
TO 테이블이 없는 예시 새 컬럼을 추가할 수 없고 SELECT 절만 변경할 수 있으므로 활용 범위가 매우 제한적입니다.
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 │
└───┘

ALTER TABLE … MODIFY REFRESH SQL 문

ALTER TABLE ... MODIFY REFRESH는 일정, 종속성, 무작위화, 갱신 설정을 비롯한 갱신 가능 구체화 뷰의 갱신 매개변수를 변경합니다.
ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...]
스케줄(EVERY 또는 AFTER)은 필수입니다. 이 구문은 모든 갱신 매개변수를 한 번에 대체합니다. 지정하지 않은 절(RANDOMIZE FOR, DEPENDS ON, SETTINGS)은 제거되거나 기본값으로 재설정됩니다. 갱신 설정만 변경하려면 현재 스케줄을 다시 지정하십시오.
-- 스케줄을 변경합니다.
ALTER TABLE rmv MODIFY REFRESH EVERY 30 MINUTE;

-- 재시도 설정을 변경합니다 (스케줄을 반드시 반복해야 합니다).
ALTER TABLE rmv MODIFY REFRESH EVERY 1 HOUR
SETTINGS refresh_retries = 5,
         refresh_retry_initial_backoff_ms = 500,
         refresh_retry_max_backoff_ms = 60000;

-- 의존성을 추가하거나 유지합니다.
ALTER TABLE rmv MODIFY REFRESH EVERY 6 HOUR DEPENDS ON other_rmv;

-- `DEPENDS ON`을 생략하여 의존성을 삭제합니다.
ALTER TABLE rmv MODIFY REFRESH EVERY 6 HOUR;
제한 사항:
  • ALTER TABLE ... MODIFY SETTING은 materialized view에서 지원되지 않으며, 갱신 설정은 MODIFY REFRESH를 통해서만 변경할 수 있습니다.
  • APPEND를 추가하거나 제거하는 작업은 지원되지 않습니다.
  • all_replicas 갱신 설정은 뷰를 생성한 후에는 변경할 수 없습니다.
전체 갱신 설정 목록은 갱신 설정에 설명되어 있습니다. 현재 적용된 설정을 포함한 갱신 상태는 system.view_refreshes에서 확인할 수 있습니다.
마지막 수정일 2026년 6월 10일