31 KiB
slug | sidebar_position | sidebar_label |
---|---|---|
/ja/sql-reference/statements/create/view | 37 | VIEW |
CREATE VIEW
新しいビューを作成します。ビューは通常のビュー、Materialized View、リフレッシュ可能なMaterialized View、およびウィンドウビュー(リフレッシュ可能なMaterialized Viewとウィンドウビューはエクスペリメンタル機能です)であることができます。
通常のビュー
構文:
CREATE [OR REPLACE] VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster_name]
[DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER | NONE }]
AS SELECT ...
[COMMENT 'comment']
通常のビューはデータを保存しません。アクセスするたびに他のテーブルからの読み取りを実行します。つまり、通常のビューは保存されたクエリにすぎません。ビューから読み取ると、この保存されたクエリがFROM句内のサブクエリとして使用されます。
例として、次のビューを作成したとします。
CREATE VIEW view AS SELECT ...
そして、クエリを記述しました。
SELECT a, b, c FROM view
このクエリは、次のサブクエリを使用するのと完全に同等です。
SELECT a, b, c FROM (SELECT ...)
パラメータ化ビュー
パラメータ化ビューは通常のビューに似ていますが、すぐには解決されないパラメータを持って作成することができます。これらのビューは、ビューの名前を関数名として、パラメータの値を引数として指定するテーブル関数で使用できます。
CREATE VIEW view AS SELECT * FROM TABLE WHERE Column1={column1:datatype1} and Column2={column2:datatype2} ...
上記は、下記のようにパラメータを代入することでテーブル関数として使用できるテーブルのビューを作成します。
SELECT * FROM view(column1=value1, column2=value2 ...)
マテリアライズドビュー
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster_name] [TO[db.]name] [ENGINE = engine] [POPULATE]
[DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER | NONE }]
AS SELECT ...
[COMMENT 'comment']
:::tip Materialized Viewを使用するステップバイステップガイドはこちらです。 :::
Materialized Viewは、対応するSELECTクエリによって変換されたデータを保存します。
TO [db].[table]
なしでMaterialized Viewを作成する場合は、データ格納のためのテーブルエンジンENGINE
を指定しなければなりません。
TO [db].[table]
でMaterialized Viewを作成する場合、POPULATE
を同時に使用することはできません。
Materialized Viewは次のように実装されています: SELECT
で指定されたテーブルにデータを挿入すると、挿入されたデータの一部がこのSELECT
クエリによって変換され、その結果がビューに挿入されます。
:::note
ClickHouseのMaterialized Viewは挿入先テーブルへのデータ挿入時にカラム名を使用します。SELECT
クエリ結果に存在しないカラム名がある場合、たとえカラムがNullableでなくても、ClickHouseはデフォルト値を使用します。Materialized Viewを使用する際には、全てのカラムに別名を付けることが安全なプラクティスとされます。
ClickHouseのMaterialized Viewは、主に挿入トリガーのように実装されています。ビュークエリに集約がある場合、それは新しく挿入されたデータバッチにのみ適用されます。ソーステーブルの既存データへの変更(例えば、更新、削除、パーティション削除など)は、Materialized Viewを変更しません。
エラー発生時にClickHouseのMaterialized Viewは決定的な振る舞いを持ちません。つまり、すでに書き込まれたブロックは保存されますが、エラー後の全てのブロックは保存されません。
デフォルトでは一つのビューへのプッシュが失敗した場合、INSERTクエリも失敗し、いくつかのブロックはデータ格納先テーブルに書き込まれないかもしれません。これはmaterialized_views_ignore_errors
設定を使用して変更できます(これはINSERT
クエリのために設定する必要があります)。materialized_views_ignore_errors=true
に設定すると、ビューへのプッシュ時の全てのエラーは無視され、全てのブロックはデータ格納先テーブルに書き込まれます。
また、デフォルトでsystem.*_log
テーブルにはmaterialized_views_ignore_errors
がtrue
に設定されています。
:::
POPULATE
を指定すると、既存のテーブルデータがビュー作成時にビューに挿入されます。それはちょうどCREATE TABLE ... AS SELECT ...
を実行するようなものです。それ以外の場合、ビューが作成された後にテーブルに挿入されたデータのみをクエリします。ビュー作成中にテーブルに挿入されたデータがビューに挿入されないため、POPULATE
の使用をおすすめしません。
:::note
POPULATE
がCREATE TABLE ... AS SELECT ...
のように機能することを考えると、いくつかの制限があります:
- レプリケートされたデータベースでのサポートはありません
- ClickHouseクラウドでのサポートはありません
代わりに個別のINSERT ... SELECT
を使用できます。
:::
SELECT
クエリにはDISTINCT
、GROUP BY
、ORDER BY
、LIMIT
を含めることができます。但し、対応する変換は挿入されたデータの各ブロックごとに独立して実行されることに注意してください。例えば、GROUP BY
が設定されている場合、データは挿入中に集約されますが、挿入されたデータのパケット内でのみ適用されます。データはそれ以上集約されません。ただし、独立してデータ集約を行うSummingMergeTree
のようなエンジンを使用する場合は例外です。
ALTERクエリをMaterialized Viewに対して実行することには限界があります。例えば、SELECT
クエリを更新することはできませんので、これが不便になる可能性があります。Materialized ViewがTO [db.]name
の構文を使用している場合、ビューをDETACH
してからターゲットテーブルに対してALTER
を実行し、その後に以前にDETACH
したビューをATTACH
できます。
Materialized Viewはoptimize_on_insert設定によって影響を受けます。データはビューへの挿入前にマージされます。
ビューは通常のテーブルと同様に見えます。例えば、SHOW TABLES
クエリの結果にリストされます。
ビューを削除するには、DROP VIEWを使用します。ただし、DROP TABLE
もビューに対して機能します。
SQLセキュリティ
DEFINER
とSQL SECURITY
により、ビューの基礎となるクエリを実行するときに使用するClickHouseユーザーを指定できます。SQL SECURITY
には、DEFINER
、INVOKER
、NONE
の3つの合法な値があります。DEFINER
句には、任意の既存のユーザーまたはCURRENT_USER
を指定できます。
以下の表は、どのユーザーがビューから選択する権限が必要かを説明します。SQLセキュリティオプションに関係なく、ビューから読み取るためにはGRANT SELECT ON <view>
が必要であることに注意してください。
SQLセキュリティオプション | ビュー | マテリアライズドビュー |
---|---|---|
DEFINER alice |
alice はビューのソーステーブルに対するSELECT 権限が必要です。 |
alice はビューのソーステーブルに対するSELECT 権限とビューのターゲットテーブルに対するINSERT 権限が必要です。 |
INVOKER |
ユーザーはビューのソーステーブルに対するSELECT 権限が必要です。 |
Materialized ViewにはSQL SECURITY INVOKER を指定できません。 |
NONE |
- | - |
:::note
SQL SECURITY NONE
は廃止予定のオプションです。このオプションでビューを作成する権限を持つユーザーは、任意のクエリを実行することができます。したがって、このオプションでビューを作成するためには、GRANT ALLOW SQL SECURITY NONE TO <user>
が必要です。
:::
DEFINER
/SQL SECURITY
が指定されていない場合、デフォルト値が使用されます:
DEFINER
/SQL SECURITY
が指定されずにビューがアタッチされた場合、Materialized Viewにはデフォルト値としてSQL SECURITY NONE
、通常のビューにはSQL SECURITY INVOKER
が使用されます。
既存のビューのSQLセキュリティを変更するには、以下を使用します。
ALTER TABLE MODIFY SQL SECURITY { DEFINER | INVOKER | NONE } [DEFINER = { user | CURRENT_USER }]
例
CREATE VIEW test_view
DEFINER = alice SQL SECURITY DEFINER
AS SELECT ...
CREATE VIEW test_view
SQL SECURITY INVOKER
AS SELECT ...
ライブビュー [廃止予定]
この機能は廃止予定であり、将来的に削除される予定です。
利便性のため、古いドキュメントはこちらにあります。
リフレッシュ可能なMaterialized View [エクスペリメンタル]
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name
REFRESH EVERY|AFTER interval [OFFSET interval]
RANDOMIZE FOR interval
DEPENDS ON [db.]name [, [db.]name [, ...]]
SETTINGS name = value [, name = value [, ...]]
[APPEND]
[TO[db.]name] [(columns)] [ENGINE = engine] [EMPTY]
AS SELECT ...
[COMMENT 'comment']
ここでinterval
は単純な間隔のシーケンスです:
number SECOND|MINUTE|HOUR|DAY|WEEK|MONTH|YEAR
定期的に対応するクエリを実行し、その結果をテーブルに格納します。
- クエリに
APPEND
が書かれている場合、各リフレッシュでは既存の行を削除せずに行をテーブルに挿入します。通常のINSERT SELECTと同様、挿入はアトミックではありません。 - それ以外の場合、各リフレッシュはテーブルの以前の内容をアトミックに置き換えます。
通常の非リフレッシュ可能なMaterialized Viewとの違い:
- 挿入トリガーがありません。すなわち、SELECTで指定されたテーブルに新しいデータが挿入されても、リフレッシュ可能なMaterialized Viewには自動的にはプッシュされません。定期的なリフレッシュがクエリ全体を実行します。
- SELECTクエリに制限がありません。テーブル関数(例えば
url()
)、ビュー、UNION、JOINがすべて許可されます。
:::note
クエリのREFRESH ... SETTINGS
部分にある設定はリフレッシュ設定(例: refresh_retries
)であり、通常の設定(例: max_threads
)とは異なります。通常の設定は、クエリの終了部分にあるSETTINGS
を使用して指定できます。
:::
リフレッシュスケジュール
リフレッシュスケジュールの例:
REFRESH EVERY 1 DAY -- 毎日、午前0時(UTC)
REFRESH EVERY 1 MONTH -- 毎月1日、午前0時に
REFRESH EVERY 1 MONTH OFFSET 5 DAY 2 HOUR -- 毎月6日、午前2時に
REFRESH EVERY 2 WEEK OFFSET 5 DAY 15 HOUR 10 MINUTE -- 2週間ごとに土曜日、午後3:10に
REFRESH EVERY 30 MINUTE -- 00:00、00:30、01:00、01:30、などで
REFRESH AFTER 30 MINUTE -- 前のリフレッシュが完了してから30分後、日付に合わせて調整されません
-- REFRESH AFTER 1 HOUR OFFSET 1 MINUTE -- AFTERではOFFSETは許可されていないため、構文エラー
REFRESH EVERY 1 WEEK 2 DAYS -- 9日ごと、特定の曜日や月に制約なし;
-- 特に、1969-12-29以降の日数が9で割り切れるとき
REFRESH EVERY 5 MONTHS -- 毎5ヶ月、毎年異なる月(12は5で割り切れないため);
-- 特に、1970-01以降の月数が5で割り切れるとき
RANDOMIZE FOR
は各リフレッシュの時間をランダムに調整します。例:
REFRESH EVERY 1 DAY OFFSET 2 HOUR RANDOMIZE FOR 1 HOUR -- 毎日午前1:30から2:30の間のランダムな時間
特定のビューについて、同時に一つのみのリフレッシュを実行可能です。例: REFRESH EVERY 1 MINUTE
のビューがリフレッシュに2分かかる場合、2分ごとにリフレッシュします。その後、10秒でリフレッシュが完了する場合、1分ごとに戻ります。(特に、バックログのすべてをカバーするために10秒ごとにリフレッシュされることはありません - そのようなバックログはありません。)
さらに、CREATE
クエリで作成されるとリフレッシュは直ちに開始されますが、EMPTY
が指定されている場合は最初のリフレッシュはスケジュールに従って行われます。
レプリケートデータベースでの動作
リフレッシュ可能なMaterialized Viewがレプリケートデータベースにある場合、レプリカ同士で調整して、スケジュールされた時間に1つのレプリカのみがリフレッシュを実行するようになります。ReplicatedMergeTreeテーブルエンジンが必要ですので、全てのレプリカがリフレッシュによって生成されたデータを参照できます。
APPEND
モードでは、SETTINGS全てのレプリカ=1
を使用して調整を無効にできます。これにより、レプリカは互いに独立してリフレッシュを実行します。この場合、ReplicatedMergeTreeは必要ありません。
非APPEND
モードでは、調整されたリフレッシュのみがサポートされています。非調整されたリフレッシュには、Atomic
データベースとCREATE ... ON CLUSTER
クエリを使用して、すべてのレプリカでリフレッシュ可能なMaterialized Viewを作成します。
調整はKeeperによって行われます。znodeパスはdefault_replica_pathサーバー設定によって決定されます。
依存関係
DEPENDS ON
は異なるテーブルのリフレッシュを同期します。たとえば、次のような2つのリフレッシュ可能なMaterialized Viewのチェーンがあるとします:
CREATE MATERIALIZED VIEW source REFRESH EVERY 1 DAY AS SELECT * FROM url(...)
CREATE MATERIALIZED VIEW destination REFRESH EVERY 1 DAY AS SELECT ... FROM source
DEPENDS ON
なしでは、両方のビューが真夜中にリフレッシュを開始し、destination
は通常、source
の昨日のデータを参照します。依存関係を追加すると:
CREATE MATERIALIZED VIEW destination REFRESH EVERY 1 DAY DEPENDS ON source AS SELECT ... FROM source
destination
のリフレッシュは、source
の同日のリフレッシュが完了した後にのみ開始されるので、destination
は新鮮なデータに基づくことになります。
または、同じ結果を以下で達成できます:
CREATE MATERIALIZED VIEW destination REFRESH AFTER 1 HOUR DEPENDS ON source AS SELECT ... FROM source
ここでの1 HOUR
はsource
のリフレッシュ期間より短ければ任意の長さに設定できます。依存するテーブルは、依存するテーブルのリフレッシュ率より頻繁にリフレッシュされることはありません。これは、リフレッシュ可能なビューのチェーンを実際のリフレッシュ期間を指定することなく設定するための有効な方法です。
いくつかのさらなる例:
REFRESH EVERY 1 DAY OFFSET 10 MINUTE
(destination
)がREFRESH EVERY 1 DAY
(source
)に依存
source
のリフレッシュが10分以上かかる場合、destination
は待機します。REFRESH EVERY 1 DAY OFFSET 1 HOUR
がREFRESH EVERY 1 DAY OFFSET 23 HOUR
に依存
上記と同様に、対応するリフレッシュが異なるカレンダー日に起こるにもかかわらず。destination
のリフレッシュは日X+1の日に始まり、source
の日Xのリフレッシュを(それが2時間以上かかる場合)待機します。REFRESH EVERY 2 HOUR
がREFRESH EVERY 1 HOUR
に依存
2時間ごとのリフレッシュは、一時間ごとのリフレッシュの後に行われます。例えば、真夜中のリフレッシュの後、次に午前2時のリフレッシュの後等。REFRESH EVERY 1 MINUTE
がREFRESH EVERY 2 HOUR
に依存
REFRESH AFTER 1 MINUTE
がREFRESH EVERY 2 HOUR
に依存
REFRESH AFTER 1 MINUTE
がREFRESH AFTER 2 HOUR
に依存
destination
はsource
の各リフレッシュ後に一度リフレッシュされます。すなわち、2時間ごと。1 MINUTE
は実質的に無視されます。REFRESH AFTER 1 HOUR
がREFRESH AFTER 1 HOUR
に依存
現在、これは推奨されていません。
:::note
DEPENDS ON
はリフレッシュ可能なMaterialized View間でのみ機能します。通常のテーブルをDEPENDS ON
リストに記載すると、ビューが一切リフレッシュされなくなります(依存関係はALTER
で削除できます、下記参照)。
:::
設定
利用可能なリフレッシュ設定:
refresh_retries
- リフレッシュクエリが例外を伴って失敗した場合に再試行する回数。すべての再試行に失敗した場合、次のスケジュールされたリフレッシュ時間にスキップします。0は再試行なしを意味し、-1は無限の再試行を意味します。デフォルト: 0。refresh_retry_initial_backoff_ms
-refresh_retries
がゼロでない場合、最初の再試行前の遅延。各再試行ごとに遅延が倍増し、refresh_retry_max_backoff_ms
まで続きます。デフォルト: 100 ms。refresh_retry_max_backoff_ms
- リフレッシュ試行間の遅延の指数増加の限界。デフォルト: 60000 ms(1分)。
リフレッシュパラメータの変更
リフレッシュパラメータを変更するには:
ALTER TABLE [db.]name MODIFY REFRESH EVERY|AFTER ... [RANDOMIZE FOR ...] [DEPENDS ON ...] [SETTINGS ...]
:::note
これは全リフレッシュパラメータ、スケジュール、依存関係、設定、およびAPPEND性を一度に置き換えます。例: テーブルにDEPENDS ON
があった場合、MODIFY REFRESH
をDEPENDS ON
なしで実行すると依存関係が削除されます。
:::
その他の操作
すべてのリフレッシュ可能なMaterialized Viewのステータスは、system.view_refreshes
テーブルで利用可能です。具体的には、リフレッシュの進行状況(実行中の場合)、最後と次回のリフレッシュ時間、失敗した場合の例外メッセージが含まれています。
リフレッシュを手動で停止、開始、トリガー、またはキャンセルするには、SYSTEM STOP|START|REFRESH|CANCEL VIEW
を使用します。
リフレッシュが完了するのを待つには、SYSTEM WAIT VIEW
を使用します。特に、リフレッシュ可能なMaterialized Viewを作成した後の初期リフレッシュを待機するのに便利です。
:::note 豆知識: リフレッシュされているビューから前のバージョンのデータを読み取ることが許可されています。これで、コンウェイのライフゲームを実装できます: https://pastila.nl/?00021a4b/d6156ff819c83d490ad2dcec05676865#O0LGWTO7maUQIA4AcGUtlA== :::
ウィンドウビュー [エクスペリメンタル]
:::info
これは将来のリリースで後方互換性がない形で変更される可能性があるエクスペリメンタルな機能です。ウィンドウビューとWATCH
クエリの使用を許可するには、allow_experimental_window_view設定を使用してset allow_experimental_window_view = 1
を入力してください。
:::
CREATE WINDOW VIEW [IF NOT EXISTS] [db.]table_name [TO [db.]table_name] [INNER ENGINE engine] [ENGINE engine] [WATERMARK strategy] [ALLOWED_LATENESS interval_function] [POPULATE]
AS SELECT ...
GROUP BY time_window_function
[COMMENT 'comment']
ウィンドウビューはデータを時間ウィンドウ別に集約し、ウィンドウが準備が整ったときに結果を出力できます。中間集計結果を内部 (もしくは指定した) テーブルに保存してレイテンシを削減し、指定されたテーブルへのプッシュやWATCH
クエリを使用して通知をプッシュすることができます。
ウィンドウビューの作成はMATERIALIZED VIEW
の作成に似ています。ウィンドウビューは中間データを保存するために内部ストレージエンジンを必要とします。内部ストレージはINNER ENGINE
句を使用して指定できます。ウィンドウビューはデフォルトの内部エンジンとしてAggregatingMergeTree
を使用します。
TO [db].[table]
なしでウィンドウビューを作成する場合、データを保存するテーブルエンジンENGINE
を指定しなければなりません。
時間ウィンドウ関数
時間ウィンドウ関数は、レコードの下限と上限ウィンドウを取得するために使用されます。ウィンドウビューは時間ウィンドウ関数と一緒に使用する必要があります。
タイムアトリビュート
ウィンドウビューは処理時間とイベント時間のプロセスをサポートします。
処理時間は、ウィンドウビューがローカルのマシンの時間に基づいて結果を生成できるようにします。これはデフォルトで使用され、最も基本的な時間概念ですが、決定性を提供しません。処理時間アトリビュートは、時間ウィンドウ関数のtime_attr
をテーブルカラムに設定するか、または関数now()
を使用して定義できます。次のクエリは処理時間を使用したウィンドウビューを作成します。
CREATE WINDOW VIEW wv AS SELECT count(number), tumbleStart(w_id) as w_start from date GROUP BY tumble(now(), INTERVAL '5' SECOND) as w_id
イベント時間は、各イベントがその制作装置で発生した時間です。この時間は、通常、レコードが生成されたときにその中に埋め込まれています。イベント時間処理は、順序が乱れたイベントや遅延イベントでも一貫した結果を得ることができます。ウィンドウビューは、WATERMARK
構文を使用してイベント時間処理をサポートしています。
ウィンドウビューは、3つのウォーターマーク戦略を提供します:
STRICTLY_ASCENDING
: これまでに観察された最大のタイムスタンプのウォーターマークを発行します。最大タイムスタンプより小さいタイムスタンプを持つ行は遅れていません。ASCENDING
: これまでに観察された最大のタイムスタンプから1を引いたウォーターマークを発行します。最大タイムスタンプと等しいか小さいタイムスタンプを持つ行は遅れていません。BOUNDED
: WATERMARK=INTERVAL。指定された遅延を引いた最大のタイムスタンプのウォーターマークを発行します。
以下のクエリは、WATERMARK
を使用してウィンドウビューを作成する例です:
CREATE WINDOW VIEW wv WATERMARK=STRICTLY_ASCENDING AS SELECT count(number) FROM date GROUP BY tumble(timestamp, INTERVAL '5' SECOND);
CREATE WINDOW VIEW wv WATERMARK=ASCENDING AS SELECT count(number) FROM date GROUP BY tumble(timestamp, INTERVAL '5' SECOND);
CREATE WINDOW VIEW wv WATERMARK=INTERVAL '3' SECOND AS SELECT count(number) FROM date GROUP BY tumble(timestamp, INTERVAL '5' SECOND);
デフォルトでは、ウォーターマークが到達するとウィンドウが発生しますが、ウォーターマークを過ぎて到着した要素は削除されます。ウィンドウビューはALLOWED_LATENESS=INTERVAL
を設定して遅れたイベントの処理をサポートします。遅延処理の例は次のとおりです:
CREATE WINDOW VIEW test.wv TO test.dst WATERMARK=ASCENDING ALLOWED_LATENESS=INTERVAL '2' SECOND AS SELECT count(a) AS count, tumbleEnd(wid) AS w_end FROM test.mt GROUP BY tumble(timestamp, INTERVAL '5' SECOND) AS wid;
遅延で発行された要素は、以前の計算の更新結果として扱われるべきであることに注意してください。ウィンドウが終了したときではなく、遅延したイベントが到着したときにすぐにウィンドウが発生します。したがって、同じウィンドウに対して複数の出力が生じます。ユーザーはこれらの重複した結果を考慮するか、重複を排除する必要があります。
ウィンドウビューで指定されたSELECT
クエリをALTER TABLE ... MODIFY QUERY
文を使用して変更できます。ビューをウィンドウビューとともに使用する場合、またはTO [db.]name
句とともに使用する場合、新しいSELECT
クエリの結果となるデータ構造は元のSELECT
クエリと同じでなければなりません。現在のウィンドウ内のデータは失われます。これは中間状態を再利用できないためです。
新しいウィンドウの監視
ウィンドウビューは、WATCHクエリをサポートして変更を監視するか、TO
構文を使用して結果をテーブルに出力します。
WATCH [db.]window_view
[EVENTS]
[LIMIT n]
[FORMAT format]
WATCH
クエリはLIVE VIEW
と同様に動作します。LIMIT
を指定することで、クエリを終了する前に受信する更新の数を設定できます。EVENTS
句を使用してWATCH
クエリの短い形式を取得することができ、クエリ結果の代わりに最新のクエリウォーターマークを取得します。
設定
window_view_clean_interval
: 古くなったデータを解放するためのウィンドウビューのクリーニング間隔(秒)。システムはシステム時間やWATERMARK
設定に従って完全にトリガーされていないウィンドウを保持し、他のデータは削除されます。window_view_heartbeat_interval
: ウォッチクエリがアクティブであることを示す心拍間隔(秒)。wait_for_window_view_fire_signal_timeout
: イベント時間処理中にウィンドウビューの発火シグナルを待機するタイムアウト。
例
例えば、data
というログテーブルで10秒ごとにクリックログの数をカウントする必要があるとします。そのテーブル構造は以下の通りです。
CREATE TABLE data ( `id` UInt64, `timestamp` DateTime) ENGINE = Memory;
まず、10秒間隔のウィンドウを持つウィンドウビューを作成します。
CREATE WINDOW VIEW wv as select count(id), tumbleStart(w_id) as window_start from data group by tumble(timestamp, INTERVAL '10' SECOND) as w_id
次に、WATCH
クエリを使って結果を取得します。
WATCH wv
ログがテーブルdata
に挿入されると、
INSERT INTO data VALUES(1,now())
WATCH
クエリは次のように結果を表示するはずです。
┌─count(id)─┬────────window_start─┐
│ 1 │ 2020-01-14 16:56:40 │
└───────────┴─────────────────────┘
または、TO
構文を使用して出力を別のテーブルに関連付けることができます。
CREATE WINDOW VIEW wv TO dst AS SELECT count(id), tumbleStart(w_id) as window_start FROM data GROUP BY tumble(timestamp, INTERVAL '10' SECOND) as w_id
追加の例は、ClickHouseのステートフルテストの中で見つけることができます(それらは*window_view*
とされています)。
ウィンドウビューの使用
ウィンドウビューは以下のシナリオで便利です:
- 監視: 時間単位でメトリクスログを集約・計算し、結果をターゲットテーブルに出力します。ダッシュボードはターゲットテーブルをソーステーブルとして使用できます。
- 分析: 時間ウィンドウでデータを自動的に集約し、前処理する。この処理は大量のログを分析する際に役立ちます。前処理によって複数のクエリでの反復計算が排除され、クエリの遅延が減少します。