> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Документация по оператору ALTER TABLE ... MODIFY QUERY

# Оператор ALTER TABLE ... MODIFY QUERY

Вы можете изменить запрос `SELECT`, указанный при создании [materialized view](/docs/ru/reference/statements/create/view#materialized-view), с помощью оператора `ALTER TABLE ... MODIFY QUERY`, не прерывая процесс ингестии.

Эта команда предназначена для изменения materialized view, созданного с конструкцией `TO [db.]name`. Она не изменяет структуру таблицы в нижележащем хранилище и не меняет определения столбцов materialized view, поэтому её применение для materialized view, созданных без конструкции `TO [db.]name`, очень ограничено.

**Пример с таблицей 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);

-- Новые столбцы `browser` и `cost` пусты, так как мы ещё не изменили Materialized View.

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
</div>

`ALTER TABLE ... MODIFY REFRESH` изменяет параметры обновления [refreshable materialized view](/docs/ru/reference/statements/create/view#refreshable-materialized-view), включая расписание, зависимости, случайное смещение и [настройки обновления](/docs/ru/reference/statements/create/view#refresh-settings).

```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` нельзя изменить после создания представления.

Полный список настроек обновления приведён в разделе [Настройки обновления](/docs/ru/reference/statements/create/view#refresh-settings). Статус обновления, включая текущие применённые настройки, можно посмотреть в [`system.view_refreshes`](/docs/ru/reference/system-tables/view_refreshes).
