このトピックでは、`CREATE MATERIALIZED VIEW` 文について説明します。この文を使用して、完全リフレッシュまたは高速リフレッシュのポリシーを持つマテリアライズドビューを作成し、その更新スケジュールを定義します。
構文
CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[COMMENT 'view_comment']
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
AS
query_body
mv_definition:
({column_name column_type [column_attributes] [ column_constraints ] [COMMENT 'column_comment']
| table_constraints}
[, ... ])
[table_attribute]
[partition_options]
[index_all]
[storage_policy]
[block_size]
[engine]
[table_properties]パラメーター
OR REPLACE | オプション | 作成後の変更:不可 | |
このパラメーターは、カーネルバージョン 3.1.4.7 以降のクラスターでのみサポートされています。
| |||
mv_definition | オプション | 作成後の変更:不可 | |
マテリアライズドビューのスキーマを定義します。 この句を省略すると、システムは query_body からスキーマを推論します。デフォルトでは、システムはプライマリキーを定義し、すべての列にインデックスを作成し、ストレージポリシーをホットストレージに設定し、XUANWU エンジンを使用します。 分散キー、パーティションキー、プライマリキー、インデックス、ホット/コールドデータストレージポリシーなど、マテリアライズドビューのスキーマを手動で定義するには、CREATE TABLE 文と同じ構文を使用します。たとえば、すべての列にインデックスを作成したくない場合は、`INDEX` キーワードを使用してインデックスを作成する列を指定できます。ストレージコストを削減するために、ホット/コールド混合ストレージポリシーを定義したり、過去 1 年間のデータのみを保持したりすることもできます。 プライマリキーのルール
推奨事項最適なクエリパフォーマンスを得るために、マテリアライズドビューを作成する際には、プライマリキー、分散キー、およびパーティションキーを定義することを推奨します。 | |||
mv_properties | オプション | 作成後の変更:可 (ALTER MATERIALIZED VIEW を使用) | |
このパラメーターは、カーネルバージョン 3.1.9.3 以降の Enterprise Edition、Basic Edition、および Data Lakehouse Edition のクラスターでのみサポートされています。 マテリアライズドビューのリソースポリシーを定義します。これには、リソース割り当てのための `mv_resource_group` と、リフレッシュタスク構成のための `mv_refresh_hints` が含まれます。値は JSON 形式である必要があります。例: mv_resource_groupマテリアライズドビューの作成とリフレッシュに使用されるリソースグループを指定します。指定しない場合、デフォルトの `user_default` リソースグループが使用されます。 このパラメーターの値は、XIHE エンジンの Interactive または Job リソースグループにすることができます。違いは、Job リソースグループはオンデマンドでリソースをプロビジョニングするため、通常、数秒から数分のレイテンシーが発生します。リフレッシュのレイテンシーに対する許容度が高い場合は、Job リソースグループを指定できます。Job リソースグループを使用するマテリアライズドビューは、エラスティックマテリアライズドビューとも呼ばれます。エラスティックマテリアライズドビューのリフレッシュ速度を向上させるには、`mv_refresh_hints` で elastic_job_max_acu パラメーターを構成して、マテリアライズドビューが使用できるリソースの最大量を変更できます。使用方法の詳細については、後述の「エラスティックマテリアライズドビューの例」セクションをご参照ください。 ご利用のクラスターで使用可能なリソースグループは、コンソールの「リソースグループ」ページで表示するか、DescribeDBResourceGroup 操作を呼び出すことで確認できます。 指定されたリソースグループが存在しない場合、操作は失敗します。 mv_refresh_hintsマテリアライズドビューの構成パラメーターを指定します。サポートされているパラメーターとその使用方法のリストについては、「共通のヒント」をご参照ください。 | |||
REFRESH [COMPLETE | FAST] | オプション | デフォルト値:COMPLETE | 作成後の変更:不可 |
マテリアライズドビューのリフレッシュポリシーを定義します。リフレッシュポリシーの違いとそのユースケースについては、「リフレッシュポリシーの選択」をご参照ください。 COMPLETE完全リフレッシュは、元のクエリ SQL を実行してベーステーブルのすべてのターゲットパーティションのデータをスキャンし、新しく計算されたデータで古いデータを完全に上書きします。 完全リフレッシュは、 FASTこのパラメーターはバージョン 3.1.9.0 以降でサポートされています。バージョン 3.1.9.0 は単一テーブルのマテリアライズドビューでのみ高速リフレッシュをサポートします。バージョン 3.2.0.0 以降は、単一テーブルと複数テーブルの両方のマテリアライズドビューで高速リフレッシュをサポートします。 高速リフレッシュを実行します。システムはビューのクエリ (`query_body`) を書き換え、ベーステーブルの変更されたデータ (`INSERT`、`DELETE`、および `UPDATE` 操作による) のみをスキャンし、これらの変更をマテリアライズドビューに適用します。これにより、各サイクルでベーステーブル全体をスキャンすることを回避し、各リフレッシュの計算コストを削減します。 高速リフレッシュを使用するマテリアライズドビューを作成する前に、クラスターとベーステーブルの両方でバイナリロギング機能を有効にする必要があります。そうしないと、作成は失敗します。手順については、「バイナリロギング機能の有効化」をご参照ください。 高速リフレッシュを使用するマテリアライズドビューの場合、更新トリガーメカニズムはスケジュールされた自動リフレッシュでなければなりません。 高速リフレッシュにはいくつかの制限事項があります。`query_body` が高速リフレッシュをサポートしていない場合、マテリアライズドビューを作成しようとするとエラーが発生します。 | |||
ON [DEMAND | OVERWRITE] | オプション | デフォルト値:DEMAND | 作成後の変更:不可 |
マテリアライズドビューの更新トリガーメカニズムを定義します。更新トリガーメカニズムの違いとそのユースケースについては、「更新トリガーメカニズムの選択」をご参照ください。 DEMANDオンデマンドリフレッシュ。これは、必要に応じてマテリアライズドビューを手動でリフレッシュしたり、 高速リフレッシュのマテリアライズドビューは OVERWRITEベーステーブルのデータが 更新トリガーメカニズムが | |||
[START WITH date] [NEXT date] | オプション | 作成後の変更:不可 | |
マテリアライズドビューの更新トリガーメカニズムが START WITH最初の更新時刻。省略した場合、ビューは作成直後にリフレッシュされます。 NEXT次のスケジュールされた更新時刻。
date時刻関数がサポートされています。時刻は秒単位で正確であり、ミリ秒は切り捨てられます。 | |||
[DISABLE | ENABLE] QUERY REWRITE | オプション | デフォルト値:DISABLE | 作成後の変更:可 (ALTER MATERIALIZED VIEW を使用) |
このパラメーターはバージョン 3.1.4 以降でのみサポートされています。 このマテリアライズドビューの自動クエリリライトを有効または無効にします。詳細については、「マテリアライズドビューのクエリリライト」をご参照ください。 DISABLE現在のマテリアライズドビューのクエリリライト機能を無効にします。 ENABLE現在のマテリアライズドビューのクエリリライト機能を有効にします。この機能を有効にすると、オプティマイザーは SQL パターンに基づいてクエリのすべてまたは一部を書き換え、マテリアライズドビューにルーティングできます。これにより、ベーステーブルでの元の計算を実行することを回避し、クエリのパフォーマンスを向上させます。 | |||
query_body | 必須 | 作成後の変更:不可 | |
マテリアライズドビューのベーステーブルに対するクエリを定義します。 SELECT 列のルール`SELECT` リストの列は、次のルールに従う必要があります:
その他の制限事項 | |||
必要な権限
例
前提条件
このトピックの例では、このセクションで作成されたベーステーブルを使用します。例を実行するには、まず次の SQL 文を使用してベーステーブルを作成してください。
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- テーブルエンジンを XUANWU に設定します。
CREATE TABLE customer (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(255),
is_vip Boolean
);
/*+ RC_DDL_ENGINE_REWRITE_XUANWUV2=false */ -- テーブルエンジンを XUANWU に設定します。
CREATE TABLE sales (
sale_id INT PRIMARY KEY,
product_id INT,
customer_id INT,
price DECIMAL(10, 2),
quantity INT,
sale_date TIMESTAMP
);完全リフレッシュのマテリアライズドビュー
5 分ごとにリフレッシュされるマテリアライズドビュー
myview1を作成します。CREATE MATERIALIZED VIEW myview1 REFRESH -- REFRESH COMPLETE と同等 NEXT now() + INTERVAL 5 minute AS SELECT count(*) as cnt FROM customer;毎日午前 2:00 にリフレッシュされるマテリアライズドビュー
myview2を作成します。CREATE MATERIALIZED VIEW myview2 REFRESH COMPLETE START WITH DATE_FORMAT(now() + INTERVAL 1 day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + INTERVAL 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer;毎週月曜日の午前 2:00 にリフレッシュされるマテリアライズドビュー
myview3を作成します。CREATE MATERIALIZED VIEW myview3 REFRESH COMPLETE ON DEMAND START WITH DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') NEXT DATE_FORMAT(now() + INTERVAL 7 - weekday(now()) day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer;毎月 1 日の午前 2:00 にリフレッシュされるマテリアライズドビュー
myview4を作成します。CREATE MATERIALIZED VIEW myview4 REFRESH -- REFRESH COMPLETE と同等 NEXT DATE_FORMAT(last_day(now()) + INTERVAL 1 day, '%Y-%m-%d 02:00:00') AS SELECT count(*) as cnt FROM customer;一度だけリフレッシュされるマテリアライズドビュー
myview5を作成します。CREATE MATERIALIZED VIEW myview5 REFRESH -- REFRESH COMPLETE と同等 START WITH now() + INTERVAL 1 day AS SELECT count(*) as cnt FROM customer;自動的にリフレッシュされず、完全に手動リフレッシュに依存するマテリアライズドビュー
myview6を作成します。CREATE MATERIALIZED VIEW myview6 ( PRIMARY KEY (customer_id) ) DISTRIBUTED BY HASH (customer_id) AS SELECT customer_id FROM customer;マテリアライズドビューを手動でリフレッシュします:
REFRESH MATERIALIZED VIEW myview6;マテリアライズドビュー
myview7を作成します。ベーステーブルが `INSERT OVERWRITE` 操作によって上書きされた後にマテリアライズドビューが自動的にリフレッシュされるため、手動でリフレッシュ時刻を定義する必要はありません。CREATE MATERIALIZED VIEW myview7 REFRESH COMPLETE ON OVERWRITE AS SELECT count(*) as cnt FROM customer;
高速リフレッシュの単一テーブルマテリアライズドビュー
高速リフレッシュを使用するマテリアライズドビューを作成する前に、クラスターとベーステーブルのバイナリロギング機能を有効にする必要があります。
SET ADB_CONFIG BINLOG_ENABLE=true;
ALTER TABLE customer binlog=true;
ALTER TABLE sales binlog=true;
高速リフレッシュの複数テーブルマテリアライズドビュー
高速リフレッシュを使用し、集計なしの複数テーブルマテリアライズドビュー `fast_mv4` を作成します。5 秒ごとにリフレッシュされます。
CREATE MATERIALIZED VIEW fast_mv4 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT c.customer_id, c.customer_name, s.sale_id, (s.price * s.quantity) AS revenue FROM sales s JOIN customer c ON s.customer_id = c.customer_id;高速リフレッシュとグループ化集計を使用する複数テーブルマテリアライズドビュー `fast_mv5` を作成します。10 秒ごとにリフレッシュされます。
CREATE MATERIALIZED VIEW fast_mv5 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT s.sale_id, c.customer_name, COUNT(*) AS cnt, SUM(s.price * s.quantity) AS revenue FROM sales s JOIN (SELECT customer_id, customer_name FROM customer) c ON c.customer_id = s.customer_id GROUP BY s.sale_id, c.customer_name;
パーティション化されたマテリアライズドビュー
マテリアライズドビュー myview8 を作成し、分散キーとパーティションキーを定義します。
CREATE MATERIALIZED VIEW myview8 (
quantity INT, -- マテリアライズドビューには、定義で明示的にリストされていなくても、クエリ結果のすべての列が含まれます。
price DECIMAL(10, 2),
sale_date TIMESTAMP
)
DISTRIBUTED BY HASH(sale_id)
PARTITION BY VALUE(date_format(sale_date, "%Y%m%d")) LIFECYCLE 30
AS
SELECT * FROM sales;キーとインデックスの定義
マテリアライズドビュー
myview9を作成し、すべての列ではなく、指定された列customer_nameにのみインデックスを作成します。CREATE MATERIALIZED VIEW myview9 ( INDEX (sale_date), PRIMARY KEY (sale_id) ) DISTRIBUTED BY HASH (sale_id) REFRESH NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;プライマリキー、分散キー、クラスタリングインデックス、指定列のインデックス、およびコメントを指定して、
myview10という名前のマテリアライズドビューを作成します。CREATE MATERIALIZED VIEW myview10 ( quantity INT, -- マテリアライズドビューには、定義で明示的にリストされていなくても、クエリ結果のすべての列が含まれます。 price DECIMAL(10, 2), KEY INDEX_ID(customer_id) COMMENT '顧客', CLUSTERED KEY INDEX(sale_id), PRIMARY KEY(sale_id,sale_date) ) DISTRIBUTED BY HASH(sale_id) COMMENT 'マテリアライズドビュー c' AS SELECT * FROM sales;
エラスティックマテリアライズドビュー
Job タイプのリソースグループ `serverless` を使用して作成およびリフレッシュし、1 日 1 回の更新頻度を持つエラスティックマテリアライズドビュー
myview11を作成します。CREATE MATERIALIZED VIEW myview11 MV_PROPERTIES='{ "mv_resource_group":"serverless" }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;Job タイプのリソースグループ `serverless` を作成とリフレッシュに使用し、このグループから 12 ACU のリソースを使用できるエラスティックマテリアライズドビュー
myview12を作成します。CREATE MATERIALIZED VIEW myview12 MV_PROPERTIES='{ "mv_resource_group":"serverless", "mv_refresh_hints":{"elastic_job_max_acu":"12"} }' REFRESH COMPLETE ON DEMAND START WITH now() NEXT now() + INTERVAL 1 DAY AS SELECT * FROM sales;
関連トピック
マテリアライズドビュー:マテリアライズドビューのユースケースと機能の更新について説明します。
マテリアライズドビューの作成:マテリアライズドビューの作成方法と一般的なエラーの解決策について説明します。
マテリアライズドビューのリフレッシュ:マテリアライズドビューで完全リフレッシュまたは高速リフレッシュを実行する方法について説明します。
マテリアライズドビューの管理:マテリアライズドビューの定義の表示、すべてのマテリアライズドビューの一覧表示、およびマテリアライズドビューの削除方法について説明します。