このトピックでは、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 | オプション | 作成後の変更:不可 | |
V3.1.4.7 以降の AnalyticDB for MySQL クラスターのみがこのパラメーターをサポートしています。
| |||
mv_definition | オプション | 作成後の変更:不可 | |
マテリアライズドビューのスキーマ。 マテリアライズドビューのスキーマを明示的に指定するかどうかを選択できます。マテリアライズドビューのスキーマを明示的に指定しない場合、AnalyticDB for MySQL は マテリアライズドビュークエリ 結果の列を使用してマテリアライズドビューの列を定義し、マテリアライズドビューのプライマリキーを指定し、すべての列にインデックスを作成し、ホットデータストレージと XUANWU エンジンを構成します。 分散キー、パーティションキー、プライマリキー、インデックス、ホットデータとコールドデータの階層型ストレージポリシーなど、マテリアライズドビューのスキーマを手動で指定する場合は、CREATE TABLE 文を実行するために使用されるのと同じスキーマ定義メソッドを使用します。たとえば、すべての列にインデックスを付ける必要がない場合は、INDEX キーワードを使用してインデックス列を指定できます。マテリアライズドビューのストレージコストを削減する場合は、マテリアライズドビューのストレージポリシーを混合ストレージに設定するか、過去 1 年以内のデータのみを保持 するように設定できます。 プライマリキールール
推奨事項マテリアライズドビューのクエリパフォーマンスを向上させるために、マテリアライズドビューを作成するときにプライマリキー、分散キー、およびパーティションキーを指定することをお勧めします。 | |||
mv_properties | オプション | 作成後の変更:可 (ALTER MATERIALIZED VIEW 文を使用) | |
V3.1.9.3 以降の AnalyticDB for MySQL Enterprise Edition、Basic Edition、または Data Lakehouse Edition クラスターのみがこのパラメーターをサポートしています。 マテリアライズドビューのリソースポリシー。リソースグループを指定する mv_resource_group パラメーターと、リフレッシュヒント構成を指定する mv_refresh_hints パラメーターで構成されます。 mv_properties パラメーターは JSON 形式です。例: mv_resource_groupマテリアライズドビューの作成とリフレッシュに使用されるリソースグループ。リソースグループを指定しない場合、user_default という名前のデフォルトのリソースグループが使用されます。 このパラメーターは、インタラクティブリソースグループ、または XIHE エンジンを使用するジョブリソースグループに設定できます。ジョブリソースグループでは、リソースをプロビジョニングするために、数秒または数分のリフレッシュレイテンシが必要です。リフレッシュレイテンシに対する高い要件がない場合は、ジョブリソースグループを指定できます。ジョブリソースグループを使用するマテリアライズドビューは、エラスティックマテリアライズドビューと呼ばれます。エラスティックマテリアライズドビューのリフレッシュパフォーマンスを向上させるには、mv_refresh_hints パラメーターの elastic_job_max_acu フィールドを構成して、マテリアライズドビューのリソース制限を増やすことができます。詳細については、次の エラスティックマテリアライズドビューの例 をご参照ください。 AnalyticDB for MySQL コンソールの リソースグループ タブでリソースグループを表示するか、DescribeDBResourceGroup 操作を呼び出してリソースグループのリストをクエリできます。 指定されたリソースグループが存在しない場合、マテリアライズドビューの作成時にエラーが発生します。 mv_refresh_hintsマテリアライズドビューのリフレッシュヒント構成。サポートされているヒントパラメーターについては、「構成とヒント構成パラメーター」トピックの「一般的なヒントパラメーター」セクションをご参照ください。 | |||
REFRESH [COMPLETE | FAST] | オプション | デフォルト値:COMPLETE | 作成後の変更:不可 |
マテリアライズドビューのリフレッシュポリシー。リフレッシュポリシーの違いと適用可能なシナリオについては、「マテリアライズドビューのリフレッシュ」トピックの「リフレッシュポリシーの選択」セクションをご参照ください。 COMPLETE完全リフレッシュは、マテリアライズドビュークエリを実行して、関連するすべてのベーステーブルパーティションのデータをスキャンし、クエリ結果を使用してマテリアライズドビューの元のデータを上書きします。 完全リフレッシュは、次のリフレッシュトリガーメカニズムをサポートしています。スケジュールされた間隔での自動リフレッシュ ( FASTV3.1.9.0 以降の AnalyticDB for MySQL クラスターのみがこのパラメーターをサポートしています。 V3.1.9.0 の AnalyticDB for MySQL クラスターでは、高速リフレッシュをサポートする単一テーブルのマテリアライズドビューのみを作成できます。 V3.2.0.0 以降の AnalyticDB for MySQL クラスターでは、高速リフレッシュをサポートする単一テーブルおよび複数テーブルのマテリアライズドビューを作成できます。 高速リフレッシュは、マテリアライズドビュークエリ (query_body) を書き直して、ベーステーブルの更新されたデータ (INSERT、DELETE、UPDATE) のみスキャンし、マテリアライズドビューのデータを更新します。これにより、ベーステーブルのすべてのデータがスキャンされるのを防ぎ、リフレッシュのオーバーヘッドを削減します。 AnalyticDB for MySQL クラスターで高速リフレッシュをサポートするマテリアライズドビューを作成する前に、クラスターとベーステーブルのバイナリロギング機能を有効にする必要があります。そうしないと、エラーが発生します。詳細については、「マテリアライズドビューのリフレッシュ」トピックの「バイナリロギング機能の有効化」セクションをご参照ください。 高速リフレッシュをサポートするマテリアライズドビューを作成する場合は、 高速リフレッシュをサポートするマテリアライズドビューには、特定の 制限 が課せられます。マテリアライズドビュークエリが高速リフレッシュの要件を満たしていない場合、マテリアライズドビューの作成時にエラーが発生します。 | |||
ON [DEMAND | OVERWRITE] | オプション | デフォルト値:DEMAND | 作成後の変更:不可 |
マテリアライズドビューのリフレッシュトリガーメカニズム。リフレッシュトリガーメカニズムの違いと適用可能なシナリオについては、「マテリアライズドビューのリフレッシュ」トピックの「リフレッシュトリガーメカニズムの選択」セクションをご参照ください。 DEMANDオンデマンドリフレッシュ。手動でリフレッシュをトリガーするか、 高速リフレッシュをサポートするマテリアライズドビューの場合、リフレッシュトリガーメカニズムは OVERWRITE
リフレッシュトリガーメカニズムを | |||
[START WITH date] [NEXT date] | オプション | 作成後の変更:不可 | |
リフレッシュトリガーメカニズムを START WITHマテリアライズドビューの最初のリフレッシュ時間。 START WITH 句を指定しない場合、最初のリフレッシュ時間はマテリアライズドビューが作成された時間です。 NEXTマテリアライズドビューの次のリフレッシュ時間。
date時間関数がサポートされており、秒単位まで正確である必要があります。ミリ秒は切り捨てられます。 | |||
[DISABLE | ENABLE] QUERY REWRITE | オプション | デフォルト値:DISABLE | 作成後の変更:可 (ALTER MATERIALIZED VIEW 文を使用) |
V3.1.4 以降の AnalyticDB for MySQL クラスターのみがこのパラメーターをサポートしています。 マテリアライズドビューのクエリ書き換え機能を有効または無効にします。詳細については、マテリアライズドビューのクエリ書き換え をご参照ください。 DISABLEマテリアライズドビューのクエリ書き換え機能を無効にします。 ENABLEマテリアライズドビューのクエリ書き換え機能を有効にします。クエリ書き換え機能を有効にすると、オプティマイザーはマテリアライズドビューを使用して、ベーステーブルで計算を実行する必要なく、SQL パターンに基づいてクエリ全体または一部を書き換えます。これにより、クエリのパフォーマンスが向上します。 | |||
query_body | 必須 | 作成後の変更:不可 | |
ベーステーブルに対するマテリアライズドビュークエリ。 完全マテリアライズドビューは、AnalyticDB for MySQL の内部テーブルと外部テーブル、既存のマテリアライズドビュー、およびビューに基づいて作成できます。ベーステーブルクエリには制限はありません。クエリの構文については、SELECT をご参照ください。 高速マテリアライズドビューは、AnalyticDB for MySQL の内部テーブルと外部テーブルに基づいてのみ作成できます。ベーステーブルクエリは、次のルールに準拠する必要があります。 SELECT 列
その他の制限
| |||
必要な権限
マテリアライズドビューを作成する前に、次のすべての権限を持っていることを確認してください。
マテリアライズドビューを作成するデータベース内のテーブルに対する CREATE 権限。
マテリアライズドビューで参照されるすべてのベーステーブルの特定の列またはすべての列に対する SELECT 権限。
自動的にリフレッシュできるマテリアライズドビューを作成する場合は、次の権限も必要です。
AnalyticDB for MySQL に
'%'で示される任意の IP アドレスから接続するための権限。マテリアライズドビュー、またはマテリアライズドビューが存在するデータベース内のすべてのテーブルに対する INSERT 権限。そうしないと、マテリアライズドビューのデータをリフレッシュできません。
例
例の準備
マテリアライズドビューを作成する前に、CREATE TABLE 文を実行してベーステーブルを作成します。
/*+ 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;
高速リフレッシュをサポートする単一テーブルマテリアライズドビューを作成する
AnalyticDB for MySQL クラスターで高速リフレッシュをサポートするマテリアライズドビューを作成する前に、クラスターとベーステーブルのバイナリロギング機能を有効にする必要があります。
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 という名前の複数テーブルマテリアライズドビューを作成します。マテリアライズドビュークエリには GROUP BY 句を含む集計関数が含まれています。
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;プライマリキー、分散キー、またはインデックスを持つマテリアライズドビューを作成する
customer_name列にインデックスが付けられたmyview9という名前のマテリアライズドビューを作成します。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;
エラスティックマテリアライズドビューを作成する
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;serverless という名前のジョブリソースグループの最大 12 AnalyticDB コンピュートユニット (ACU) のリソースを使用して、1 日に 1 回自動的にリフレッシュされる
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;
参照
マテリアライズドビュー: マテリアライズドビューの適用可能なシナリオと機能の更新について説明します。
マテリアライズドビューを作成する: マテリアライズドビューの作成方法、一般的なエラー、およびトラブルシューティングについて説明します。
マテリアライズドビューをリフレッシュする: マテリアライズドビューの完全リフレッシュまたは高速リフレッシュを構成する方法について説明します。
マテリアライズドビューを管理する: マテリアライズドビューの定義のクエリ、すべてのマテリアライズドビューのクエリ、およびマテリアライズドビューの削除方法について説明します。