> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-trino-dialect.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ALTER TABLE ... MODIFY QUERY SQL 문에 대한 문서

# ALTER TABLE ... MODIFY QUERY SQL 문

수집 과정을 중단하지 않고도, [materialized view](/ko/reference/statements/create/view#materialized-view)를 생성할 때 지정한 `SELECT` 쿼리를 `ALTER TABLE ... MODIFY QUERY` 문으로 수정할 수 있습니다.

이 명령은 `TO [db.]name` 절로 생성된 materialized view를 변경하기 위해 설계되었습니다. 이 명령은 기반 저장소 테이블의 구조를 변경하지 않으며, materialized view의 컬럼 정의도 변경하지 않습니다. 따라서 `TO [db.]name` 절 없이 생성된 materialized view에는 이 명령을 적용할 수 있는 경우가 매우 제한적입니다.

**TO 테이블을 사용하는 예시**

```sql theme={null}
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      │         │         48 │    0 │
│ 2020-01-01 00:00:00 │ imp        │         │         48 │    0 │
│ 2020-01-02 00:00:00 │ click      │         │         50 │    0 │
│ 2020-01-02 00:00:00 │ imp        │         │         50 │    0 │
│ 2020-01-03 00:00:00 │ click      │         │          2 │    0 │
│ 2020-01-03 00:00:00 │ imp        │         │          2 │    0 │
└─────────────────────┴────────────┴─────────┴────────────┴──────┘

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      │         │         48 │     0 │
│ 2020-01-01 00:00:00 │ imp        │         │         48 │     0 │
│ 2020-01-02 00:00:00 │ click      │         │         50 │     0 │
│ 2020-01-02 00:00:00 │ imp        │         │         50 │     0 │
│ 2020-01-03 00:00:00 │ click      │ firefox │         16 │  6.84 │
│ 2020-01-03 00:00:00 │ click      │         │          2 │     0 │
│ 2020-01-03 00:00:00 │ click      │ safary  │         16 │  9.82 │
│ 2020-01-03 00:00:00 │ click      │ chrome  │         16 │  5.63 │
│ 2020-01-03 00:00:00 │ imp        │         │          2 │     0 │
│ 2020-01-03 00:00:00 │ imp        │ firefox │         16 │ 15.14 │
│ 2020-01-03 00:00:00 │ imp        │ safary  │         16 │  6.14 │
│ 2020-01-03 00:00:00 │ imp        │ chrome  │         16 │  7.89 │
│ 2020-01-04 00:00:00 │ click      │ safary  │          1 │   0.1 │
│ 2020-01-04 00:00:00 │ click      │ firefox │          1 │   0.1 │
│ 2020-01-04 00:00:00 │ imp        │ firefox │          1 │   0.1 │
│ 2020-01-04 00:00:00 │ imp        │ chrome  │          1 │   0.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` 절만 변경할 수 있으므로 활용 범위가 매우 제한적입니다.

```sql theme={null}
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;
```

```text theme={null}
┌─a─┐
│ 1 │
│ 2 │
└───┘
```

```sql theme={null}
ALTER TABLE mv MODIFY QUERY SELECT a * 2 as a FROM src_table;
INSERT INTO src_table (a) VALUES (3), (4);
SELECT * FROM mv;
```

```text theme={null}
┌─a─┐
│ 6 │
│ 8 │
└───┘
┌─a─┐
│ 1 │
│ 2 │
└───┘
```

<div id="alter-table--modify-refresh-statement">
  ## ALTER TABLE ... MODIFY REFRESH SQL 문
</div>

`ALTER TABLE ... MODIFY REFRESH`는 일정, 종속성, 무작위화, [갱신 설정](/ko/reference/statements/create/view#refresh-settings)을 비롯한 [갱신 가능 구체화 뷰](/ko/reference/statements/create/view#refreshable-materialized-view)의 갱신 매개변수를 변경합니다.

```sql theme={null}
ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...]
```

스케줄(`EVERY` 또는 `AFTER`)은 필수입니다. 이 구문은 모든 갱신 매개변수를 한 번에 대체합니다. 지정하지 않은 절(`RANDOMIZE FOR`, `DEPENDS ON`, `SETTINGS`)은 제거되거나 기본값으로 재설정됩니다. 갱신 설정만 변경하려면 현재 스케줄을 다시 지정하십시오.

이 명령은 materialized view 또는 해당 대상 테이블을 다시 생성하거나, 기존 대상 데이터를 지우거나, 이미 실행 중인 갱신을 취소하지 않고 기존 뷰의 갱신 구성을 직접 업데이트합니다. 구성이 변경되는 동안에도 기존 대상 테이블에 대한 읽기는 계속됩니다.

동일한 완전한 `REFRESH` 사양으로 명령을 반복해도 안전합니다. 위에서 설명한 대로 실행할 때마다 모든 갱신 매개변수가 대체되므로, 구성 상태를 유지해야 하는 모든 절을 반드시 반복하십시오.

```sql theme={null}
-- 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;
```

제한 사항:

* `ALTER TABLE ... MODIFY SETTING`은 materialized view에서 지원되지 않으며, 갱신 설정은 `MODIFY REFRESH`를 통해서만 변경할 수 있습니다.
* `APPEND`를 추가하거나 제거하는 작업은 지원되지 않습니다.
* `all_replicas` 갱신 설정은 뷰를 생성한 후에는 변경할 수 없습니다.

전체 갱신 설정 목록은 [갱신 설정](/ko/reference/statements/create/view#refresh-settings)에 설명되어 있습니다. 현재 적용된 설정을 포함한 갱신 상태는 [`system.view_refreshes`](/ko/reference/system-tables/view_refreshes)에서 확인할 수 있습니다.
