このトピックでは、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マテリアライズドビューの作成とリフレッシュに使用されるリソースグループを指定します。指定しない場合、デフォルトの このパラメーターの値は、XIHE エンジンの Interactive または Job リソースグループを指定できます。違いは、Job リソースグループはオンデマンドでリソースをプロビジョニングするため、通常は数秒から数分のレイテンシーが発生します。リフレッシュレイテンシーに対する許容度が高い場合は、Job リソースグループを指定できます。Job リソースグループを使用するマテリアライズドビューは、エラスティックマテリアライズドビューとも呼ばれます。エラスティックマテリアライズドビューのリフレッシュ速度を上げるには、 クラスターで利用可能なリソースグループは、コンソールの [Resource Groups] ページで確認するか、DescribeDBResourceGroup API を呼び出すことで確認できます。 指定されたリソースグループが存在しない場合、操作は失敗します。 mv_refresh_hintsマテリアライズドビューの設定パラメーターを指定します。サポートされているパラメーターとその使用方法の一覧については、「共通ヒント」をご参照ください。 |
|||
REFRESH [COMPLETE | FAST] |
オプション |
デフォルト値:COMPLETE |
作成後の変更:不可 |
|
マテリアライズドビューのリフレッシュポリシーを定義します。リフレッシュポリシーの違いとそれぞれのユースケースについては、「リフレッシュポリシーの選択」をご参照ください。 COMPLETE完全リフレッシュでは、元のクエリ SQL を実行してベーステーブル内のすべての対象パーティションのデータをスキャンし、新しく計算されたデータで古いデータを完全に上書きします。 完全リフレッシュは、 FASTこのパラメーターは、バージョン 3.1.9.0 以降でサポートされています。バージョン 3.1.9.0 は、単一テーブルのマテリアライズドビューでのみ高速リフレッシュをサポートします。バージョン 3.2.0.0 以降は、単一テーブルと複数テーブルの両方のマテリアライズドビューで高速リフレッシュをサポートします。 高速リフレッシュを実行します。システムはビューのクエリ ( 高速リフレッシュを使用するマテリアライズドビューを作成する前に、クラスターとベーステーブルの両方でバイナリロギング機能を有効にする必要があります。そうしないと、作成は失敗します。手順については、「バイナリロギング機能の有効化」をご参照ください。 高速リフレッシュを使用するマテリアライズドビューの場合、リフレッシュトリガーメカニズムはスケジュールされた自動リフレッシュである必要があります。 高速リフレッシュにはいくつかの制限事項があります。 |
|||
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 列のルールSELECT リストの列は、次のルールに従う必要があります。
その他の制限事項
|
|||
必要な権限
マテリアライズドビューを作成するユーザーは、次のすべての権限を持っている必要があります。
マテリアライズドビューが作成されるデータベースに対する CREATE 権限。
マテリアライズドビューのすべてのベーステーブルの関連する列 (またはテーブル全体) に対する SELECT 権限。
自動的にリフレッシュされるマテリアライズドビューを作成するには、次の 2 つの権限も必要です。
任意の IP アドレス (つまり
'%') から AnalyticDB for MySQL に接続する権限。マテリアライズドビューまたはマテリアライズドビューが存在するデータベース内のすべてのテーブルに対する
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
);/*+ 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_mv1を作成します。10 秒ごとにリフレッシュされます。CREATE MATERIALIZED VIEW fast_mv1 REFRESH FAST NEXT now() + INTERVAL 10 second AS SELECT sale_id, sale_date, price FROM sales WHERE price > 10;高速リフレッシュを使用し、グループ化集計を行う単一テーブルマテリアライズドビュー
fast_mv2を作成します。5 秒ごとにリフレッシュされます。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 -- 条件には任意の式を使用できます。 GROUP BY customer_id, sale_date;高速リフレッシュを使用し、グループ化集計を行わない単一テーブルマテリアライズドビュー
fast_mv3を作成します。1 分ごとにリフレッシュされます。CREATE MATERIALIZED VIEW fast_mv3 REFRESH FAST NEXT now() + INTERVAL 1 minute AS SELECT count(*) AS cnt -- システムは自動的に定数のプライマリキーを生成し、マテリアライズドビューにレコードが 1 つだけ存在するようにします。 FROM sales;
高速リフレッシュを使用する複数テーブルのマテリアライズドビュー
-
高速リフレッシュを使用し、集計なしの複数テーブルマテリアライズドビュー
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を作成し、すべての列ではなく、指定された列sale_dateにのみインデックスを作成します。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;
関連トピック
-
マテリアライズドビュー:マテリアライズドビューのユースケースと機能の更新について説明します。
-
マテリアライズドビューの作成:マテリアライズドビューの作成方法と、一般的なエラーの解決策について説明します。
-
マテリアライズドビューのリフレッシュ:マテリアライズドビューで完全リフレッシュまたは高速リフレッシュを実行する方法について説明します。
-
マテリアライズドビューの管理:マテリアライズドビューの定義の表示、すべてのマテリアライズドビューの一覧表示、マテリアライズドビューの削除方法について説明します。