メインコンテンツへスキップ
メインコンテンツへスキップ

ALTER TABLE ... MODIFY QUERY ステートメント

ALTER TABLE ... MODIFY QUERY ステートメントを使用すると、インジェスト処理を中断することなく、マテリアライズドビュー 作成時に指定した SELECT クエリを変更できます。

このコマンドは、TO [db.]name 句を伴って作成されたマテリアライズドビューを変更するためのものです。基盤となるストレージテーブルの構造や、マテリアライズドビューのカラム定義は変更しないため、TO [db.]name 句を指定せずに作成されたマテリアライズドビューに対しては、このコマンドの適用範囲はごく限られます。

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;

-- マテリアライズドビューと 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` は空になっています。

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) SETTINGS index_granularity = 8192

-- !!! カラム定義は変更されていませんが問題ありません。クエリしているのは -- 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 ステートメント

ALTER TABLE ... MODIFY REFRESH ステートメントは、リフレッシュ可能なマテリアライズドビューのリフレッシュパラメーターを変更します。詳しくはリフレッシュパラメーターの変更を参照してください。