このトピックでは、完全リフレッシュまたは高速リフレッシュをサポートするマテリアライズドビューを作成し、そのリフレッシュスケジュールを構成するために使用できるCREATE MATERIALIZED VIEWステートメントについて説明します。
構文
CREATE [OR REPLACE] MATERIALIZED VIEW mv_name
[mv_definition]
[mv_properties]
[REFRESH {COMPLETE|FAST}]
[ON {DEMAND|OVERWRITE}]
[START WITH date] [NEXT date]
[{DISABLE|ENABLE} QUERY REWRITE]
[COMMENT 'view_comment']
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 | オプション | 作成後に変更可能:いいえ | |
AnalyticDB for MySQL クラスターのV3.1.4.7以降のみ、このパラメーターをサポートしています。
| |||
mv_definition | オプション | 作成後に変更可能:いいえ | |
マテリアライズドビューの構造を定義できます。 マテリアライズドビューのスキーマを明示的に定義するかどうかを選択できます。スキーマを明示的に定義しない場合、AnalyticDB for MySQL は query_body 結果の列をマテリアライズドビューの列として使用し、プライマリキーを定義し、すべての列にインデックスを作成し、ホットデータストレージを構成し、エンジンをXUANWUに設定します。 分散キー、パーティションキー、プライマリキー、インデックス、ホットデータとコールドデータの階層型ストレージポリシーを含むスキーマを手動で定義するには、CREATE TABLE ステートメントと同じ方法を使用します。たとえば、すべての列をインデックス化する必要がない場合は、INDEX キーワードを使用してインデックス化する列を指定します。ストレージコストを削減するには、ストレージポリシーを混合ホット/コールドストレージに設定するか、過去1年間のデータのみを保持するように設定します。 プライマリキーのルール
推奨事項クエリパフォーマンスを最適化するには、マテリアライズドビューの作成時にプライマリキー、分散キー、およびパーティションキーを定義します。 | |||
mv_properties | オプション | 作成後に変更可能:はい (ALTER MATERIALIZED VIEW ステートメントを使用) | |
AnalyticDB for MySQL Enterprise Edition、Basic Edition、またはData Lakehouse Edition クラスターのV3.1.9.3以降のみ、このパラメーターをサポートしています。 マテリアライズドビューのリソースポリシー。使用されるリソースグループ (mv_resource_group) とリフレッシュタスクの構成ヒント (mv_refresh_hints) が含まれます。このパラメーターはJSON形式を使用します。例: mv_resource_groupマテリアライズドビューの作成とリフレッシュに使用されるリソースグループ。指定しない場合、デフォルトのリソースグループ user_default が使用されます。 これをインタラクティブなリソースグループまたはXIHEエンジンを搭載したジョブリソースグループに設定できます。ジョブリソースグループは、リソースのプロビジョニングに数秒から数分かかります。リフレッシュのレイテンシーが高いことを許容できる場合は、ジョブリソースグループを使用します。ジョブリソースグループを使用するマテリアライズドビューは、エラスティックマテリアライズドビューと呼ばれます。エラスティックマテリアライズドビューのリフレッシュ速度を向上させるには、mv_refresh_hints で elastic_job_max_acu を構成して、最大リソース制限を増やします。エラスティックマテリアライズドビューの例をご参照ください。 利用可能なリソースグループは、コンソールのリソースグループページで確認するか、DescribeDBResourceGroup 操作を呼び出すことで確認できます。 指定されたリソースグループが存在しない場合、マテリアライズドビューの作成時にエラーが発生します。 mv_refresh_hintsマテリアライズドビューの構成パラメーターを指定します。サポートされているパラメーターとその使用方法のリストについては、共通ヒントをご参照ください。 | |||
REFRESH [COMPLETE | FAST] | オプション | デフォルト値:COMPLETE | 作成後に変更可能:いいえ |
マテリアライズドビューのリフレッシュポリシー。ポリシー間の違いと適用シナリオについては、リフレッシュポリシーの選択方法をご参照ください。 COMPLETE完全リフレッシュは、毎回元のクエリSQLを実行し、ベーステーブルのすべてのターゲットパーティションをスキャンし、古いデータを新しく計算されたデータで上書きします。 完全リフレッシュは、次のトリガーメカニズムをサポートしています。オンデマンド手動リフレッシュ、スケジュールされた自動リフレッシュ ( FASTAnalyticDB for MySQL クラスターのV3.1.9.0以降のみ、このパラメーターをサポートしています。V3.1.9.0は高速リフレッシュを伴う単一テーブルのマテリアライズドビューのみをサポートしています。V3.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 | 必須 | 作成後に変更可能:いいえ | |
マテリアライズドビューのベーステーブルクエリ。 完全更新を実行するマテリアライズドビューの場合、基底テーブルには内部テーブル、外部テーブル、既存のマテリアライズドビュー、および AnalyticDB for MySQL のビューを使用できます。基底テーブルのクエリには制限はありません。クエリ構文の詳細については、「SELECT」をご参照ください。 増分更新付きマテリアライズドビューの場合、ベーステーブルは AnalyticDB for MySQL の内部テーブルのみを使用できます。ベーステーブルのクエリは、以下のルールに従う必要があります: SELECT 出力列
その他の制限
| |||
必要な権限
マテリアライズドビューを作成するには、ユーザーは次のすべての権限を持っている必要があります。
マテリアライズドビューが作成されるデータベースに対するCREATE権限。
マテリアライズドビューの関連する列またはベーステーブル全体に対するSELECT権限。
自動リフレッシュマテリアライズドビューを作成する場合は、次の権限も必要です。
AnalyticDB for MySQL への、任意の IP アドレス (
'%') からの接続権限。マテリアライズドビュー内のデータをリフレッシュするには、ビュー自体、またはそのデータベース内のすべてのテーブルに対するINSERT権限が必要です。
例
例の準備
以下のマテリアライズドビューの例では、このセクションで定義されているベーステーブルを使用します。例を試すには、まずここに記載されている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;毎日02:00: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;毎週月曜日02:00: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日の02:00: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;1回のみリフレッシュされる
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という名前のマテリアライズドビューを作成します。手動リフレッシュ時間は不要です。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;
10秒間隔で高速リフレッシュをサポートする fast_mv1 という名前の単一テーブルのマテリアライズドビューを作成します。マテリアライズドビュークエリに集計関数は含まれません。
CREATE MATERIALIZED VIEW fast_mv1 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT sale_id, sale_date, price FROM sales WHERE price > 10;5秒間隔で高速リフレッシュをサポートする fast_mv2 という名前の単一テーブルのマテリアライズドビューを作成します。マテリアライズドビュークエリにGROUP BY句を含む集計関数が含まれます。
CREATE MATERIALIZED VIEW fast_mv2 REFRESH FAST NEXT now() + INTERVAL 5 second AS SELECT customer_id, sale_date, -- システムはGROUP BY列をマテリアライズドビューのプライマリキーとして使用します。 COUNT(sale_id) AS cnt_sale_id, -- 列に対して集計操作を実行。 SUM(price * quantity) AS total_revenue, -- 列に対して集計操作を実行。 customer_id / 100 AS new_customer_id -- 集計操作に関与しない列を式を使用して定義できます。 FROM sales WHERE ifnull(price, 1) > 0 -- WHERE条件を式を使用して定義できます。 GROUP BY customer_id, sale_date;1分間隔で高速リフレッシュをサポートする fast_mv3 という名前の単一テーブルのマテリアライズドビューを作成します。マテリアライズドビュークエリにGROUP BY句を含まない集計関数が含まれます。
CREATE MATERIALIZED VIEW fast_mv3 REFRESH FAST NEXT now() + INTERVAL 1 minute AS SELECT count(*) AS cnt -- システムは、マテリアライズドビューに1つのレコードのみが含まれるように、定数をプライマリキーとして生成します。 FROM sales;
高速リフレッシュをサポートする複数テーブルのマテリアライズドビューの作成
5秒間隔で高速リフレッシュをサポートし、集約を使用しない fast_mv4 という名前の複数テーブルのマテリアライズドビューを作成します。
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;10秒間隔で高速リフレッシュをサポートし、グループ化集約を使用する fast_mv5 という名前の複数テーブルのマテリアライズドビューを作成します。
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 'customer', CLUSTERED KEY INDEX(sale_id), PRIMARY KEY(sale_id,sale_date) ) DISTRIBUTED BY HASH(sale_id) COMMENT 'MATERIALIZED VIEW c' AS SELECT * FROM sales;
エラスティックマテリアライズドビュー
サーバーレスジョブリソースグループを使用し、毎日リフレッシュされる
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;サーバーレスジョブリソースグループを使用し、最大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;
関連ドキュメント
マテリアライズドビュー:適用シナリオと機能更新について説明します。
マテリアライズドビューの作成:マテリアライズドビューの作成方法と一般的なエラーのトラブルシューティングについて説明します。
マテリアライズドビューのリフレッシュ:完全リフレッシュまたは高速リフレッシュの構成方法について説明します。
マテリアライズドビューの管理:定義のクエリ、すべてのマテリアライズドビューのリスト表示、およびマテリアライズドビューの削除方法について説明します。