マテリアライズドビューは、 JOIN や AGGREGATE などの時間のかかる操作の結果を事前に計算して保存するため、後続のクエリでは再計算を行わずに、保存された結果を直接読み取ることができます。
背景
ビューは、クエリで定義される仮想テーブルです。一方、マテリアライズドビューは、事前計算されたクエリ結果を保存する物理テーブルであり、ストレージリソースを消費します。課金の詳細については、課金ルールをご参照ください。
マテリアライズドビューは、次のシナリオに適しています。
パターンが固定された頻繁に実行されるクエリ。
集約や結合など、時間のかかる操作を伴うクエリ。
テーブル内のデータの一部のみにアクセスするクエリ。
次の表は、従来のクエリとマテリアライズドビュークエリを比較したものです。
項目 | 従来のクエリ | マテリアライズドビュークエリ |
クエリ文 | SQL 文を使用してデータを直接クエリします。 | マテリアライズドビューを作成してからクエリします。 次の文でマテリアライズドビューを作成します。 マテリアライズドビューをクエリします。 マテリアライズドビューのクエリリライトが有効な場合、次のクエリを実行すると、システムは自動的にマテリアライズドビューを使用します。 |
クエリの特性 | クエリはテーブルを読み取り、結合を実行し、フィルター (WHERE 句) を適用します。大規模なソーステーブルの場合、これらの操作は低速でリソースを大量に消費します。 | クエリはマテリアライズドビューを読み取り、フィルターを適用します。結合は不要です。MaxCompute は、クエリを最適なマテリアライズドビューに自動的にマッチングし、そこから直接データを読み取るため、クエリパフォーマンスが大幅に向上します。 |
コマンド
タイプ | 説明 | 権限 | エントリポイント |
クエリステートメントに基づいてマテリアライズドビューを作成します。 | CreateTable 権限が必要です。 | これらのコマンドは、次のツールを使用して実行します: | |
マテリアライズドビューを更新します。 | Alter 権限が必要です。 | ||
マテリアライズドビューのライフサイクルを変更します。 | Alter 権限が必要です。 | ||
マテリアライズドビューのライフサイクルを有効または無効にします。 | Alter 権限が必要です。 | ||
マテリアライズドビューの基本情報をクエリします。 | Describe 権限が必要です。 | ||
マテリアライズドビューが有効か無効かを確認します。 | Describe 権限が必要です。 | ||
プロジェクト内のすべてのマテリアライズドビュー、または特定の条件に一致するマテリアライズドビューを一覧表示します。 | List 権限が必要です。 | ||
マテリアライズドビューを削除します。 | Drop 権限が必要です。 | ||
マテリアライズドビューからパーティションを削除します。 | Drop 権限が必要です。 | ||
クエリされたデータがマテリアライズドビューにない場合、ソースパーティションテーブルからデータを自動的に取得します。 | ソーステーブルに対する Select 権限が必要です。 | ||
クエリステートメントを、マテリアライズドビューを使用するように書き換えます。 | マテリアライズドビューに対する Select 権限が必要です。 | ||
マテリアライズドビューの定期的な更新をスケジュールします。 | Alter 権限が必要です。 |
制限
ウィンドウ関数、ユーザー定義テーブル値関数 (UDTF)、およびユーザー定義スカラー関数 (UDF) やユーザー定義集計関数 (UDAF) などの非決定性関数はサポートされていません。
非決定性関数を使用する必要がある場合は、次のセッションレベルのプロパティを設定してください。 set odps.sql.materialized.view.support.nondeterministic.function=true;。
マテリアライズドビューの作成 (パーティショニングとクラスタリング)
クエリ結果からマテリアライズドビューを作成します。必要に応じて、マテリアライズドビューにパーティショニングとクラスタリングを指定できます。
制限事項
マテリアライズドビューの名前はプロジェクト内で一意である必要があり、既存のテーブル、ビュー、またはマテリアライズドビューと同じ名前は使用できません。プロジェクト内のすべてのテーブルとマテリアライズドビューの名前を確認するには、
SHOW TABLES;コマンドを実行します。既存のマテリアライズドビューに基づいてマテリアライズドビューを作成することはできません。
外部テーブルに基づいてマテリアライズドビューを作成することはできません。
使用上の注意
定義クエリが失敗した場合、マテリアライズドビューの作成も失敗します。
マテリアライズドビューのパーティションキー列は、ソーステーブルから派生したものである必要があります。パーティションキー列の順序と数はソーステーブルと一致している必要がありますが、名前は異なっていてもかまいません。
一部の列に対してのみコメントを指定した場合、エラーが返されます。
パーティショニングとクラスタリングの両方を指定できます。この場合、各パーティション内のデータには、指定したクラスタリング特性が適用されます。
定義クエリにサポートされていない演算子が含まれている場合、エラーが返されます。サポートされている演算子の一覧については、「マテリアライズドビューのクエリリライト」をご参照ください。
デフォルトでは、MaxCompute では、ユーザー定義関数 (UDF) やユーザー定義集計関数 (UDAF) などの非決定性関数を使用したマテリアライズドビューの作成はサポートされていません。非決定性関数が必要な場合は、セッションレベルで
set odps.sql.materialized.view.support.nondeterministic.function=true;コマンドを実行してください。マテリアライズドビューは空のパーティションに対応しています。ソーステーブルのパーティションが空の場合、マテリアライズドビューの更新により、対応する空のパーティションが自動的に作成されます。
構文
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [project_name.]<mv_name> [LIFECYCLE <days>] --ライフサイクルを指定します。 [BUILD DEFERRED] --データを投入せずにスキーマを作成します。 [(<col_name> [COMMENT <col_comment>], ...)] --列コメント。 [DISABLE REWRITE] --マテリアライズドビューをクエリリライトに使用できるかどうかを指定します。 [COMMENT 'table comment'] --テーブルコメント。 [PARTITIONED BY (<col_name> [, <col_name>, ...])] --マテリアライズドビューをパーティションテーブルとして作成します。 [CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) [SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> BUCKETS] --クラスター化テーブルのシャッフルとソートの特性を設定します。 [REFRESH EVERY <num> {MINUTES | HOURS | DAYS}] [TBLPROPERTIES("compressionstrategy"="{normal|high|extreme}", --テーブルのデータ保存圧縮戦略を指定します。 "enable_auto_substitute"="true", --パーティションが存在しない場合に、ソーステーブルへのクエリパススルーを有効にするかどうかを指定します。 "enable_auto_refresh"="true", --自動更新を有効にするかどうかを指定します。 "refresh_interval_minutes"="120", --更新間隔を指定します。 "only_refresh_max_pt"="true" --パーティション化されたマテリアライズドビューの場合、ソーステーブルから最新のパーティションのみを自動的に更新します。 )] AS <select_statement>;パラメーター
パラメーター
必須
説明
IF NOT EXISTS
いいえ
IF NOT EXISTSを指定せず、マテリアライズドビューがすでに存在する場合、エラーが発生して操作は失敗します。project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
マテリアライズドビューの名前です。
days
いいえ
マテリアライズドビューのライフサイクル (日数) です。値は 1 〜 37231 の整数である必要があります。
BUILD DEFERRED
いいえ
指定した場合、データを投入せずにマテリアライズドビューのスキーマを作成します。
col_name
いいえ
マテリアライズドビュー内の列名です。
col_comment
いいえ
列のコメントです。
DISABLE REWRITE
いいえ
マテリアライズドビューのクエリリライトを無効にします。デフォルトでは、クエリリライトは有効になっています。
ALTER MATERIALIZED VIEW [project_name.]<mv_name> DISABLE REWRITE;を実行してクエリリライトを無効にし、ALTER MATERIALIZED VIEW [project_name.]<mv_name> ENABLE REWRITE;を実行して有効にすることができます。PARTITIONED BY
いいえ
パーティションキー列です。このパラメーターを使用して、パーティション化されたマテリアライズドビューを作成します。
CLUSTERED BY|RANGE CLUSTERED BY
いいえ
クラスター化テーブルを作成するためのシャッフル特性です。
SORTED BY
いいえ
クラスター化テーブルを作成するためのソート特性です。
REFRESH EVERY
いいえ
マテリアライズドビューのスケジュール更新間隔です。有効な単位は MINUTES、HOURS、または DAYS です。
number_of_buckets
いいえ
クラスター化テーブルを作成する際のバケット数です。
TBLPROPERTIES
いいえ
compressionstrategy :データ保存の圧縮戦略を指定します。有効な値は
normal、high、extremeです。enable_auto_substitute :パーティションが存在しない場合に、ソースのパーティションテーブルへのクエリパススルーを有効にするかどうかを指定します。詳細については、「マテリアライズドビューのクエリリライト」をご参照ください。enable_auto_refresh :オプション。このプロパティを
trueに設定すると、自動更新が有効になります。refresh_interval_minutes :
enable_auto_refreshがtrueに設定されている場合にのみ必須です。更新間隔 (分) を指定します。only_refresh_max_pt :オプション。このプロパティは、パーティション化されたマテリアライズドビューにのみ適用されます。
trueに設定すると、ソーステーブルの最新パーティションのみが更新されます。
select_statement
はい
マテリアライズドビューを定義する SELECT ステートメントです。詳細については、「SELECT Syntax」をご参照ください。
例
例 1 :マテリアライズドビューの作成
2 つのテーブル
mf_tとmf_t1を作成し、データを挿入します。CREATE TABLE IF NOT EXISTS mf_t( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t ADD PARTITION (ds='1'); INSERT INTO mf_t PARTITION (ds='1') VALUES (1,10,'田中'),(2,20,'鈴木'); SELECT * FROM mf_t WHERE ds ='1'; -- 次の結果が返されます。 +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | 田中 | 1 | | 2 | 20 | 鈴木 | 1 | +------------+------------+------------+------------+ CREATE TABLE IF NOT EXISTS mf_t1( id bigint, value bigint, name string) PARTITIONED BY (ds STRING); ALTER TABLE mf_t1 ADD PARTITION (ds='1'); INSERT INTO mf_t1 PARTITION (ds='1') VALUES (1,10,'田中'),(3,20,'佐藤'); SELECT * FROM mf_t1 WHERE ds ='1'; -- 次の結果が返されます。 +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | 田中 | 1 | | 3 | 20 | 佐藤 | 1 | +------------+------------+------------+------------+マテリアライズドビューを作成します。
サンプル 1 :
dsをパーティションキーとして、パーティション化されたマテリアライズドビューを作成します。CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 ( key comment 'unique id', value comment 'input value', ds comment 'partition' ) PARTITIONED BY (ds) AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1'; --マテリアライズドビューをクエリします。 SELECT * FROM mf_mv WHERE ds =1; +------------+------------+------------+ | key | value | ds | +------------+------------+------------+ | 1 | 10 | 1 | +------------+------------+------------+サンプル 2 :パーティション化されていない、クラスター化されたマテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW mf_mv2 LIFECYCLE 7 CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';サンプル 3 :パーティション化とクラスタリングを指定して、マテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW mf_mv3 LIFECYCLE 7 PARTITIONED BY (ds) CLUSTERED BY (key) SORTED BY (value) INTO 1024 buckets AS SELECT t1.id AS key, t1.value AS value, t1.ds AS ds FROM mf_t AS t1 JOIN mf_t1 AS t2 ON t1.id = t2.id AND t1.ds=t2.ds AND t1.ds='1';
例 2 :空のソースパーティションからの更新による空パーティションの作成
CREATE TABLE mf_blank_pts(id bigint ,name string) PARTITIONED BY (ds bigint); ALTER TABLE mf_blank_pts ADD PARTITION (ds = 1); ALTER TABLE mf_blank_pts ADD PARTITION (ds = 2); INSERT INTO TABLE mf_blank_pts PARTITION(ds=1) VALUES (1,"aba"),(2,"cbd"); CREATE MATERIALIZED VIEW IF NOT EXISTS mf_mv_blank_pts PARTITIONED BY (ds) AS SELECT id,name,ds FROM mf_blank_pts; ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>0); SHOW PARTITIONS mf_mv_blank_pts; --ソーステーブルのパーティション ds=2 は空です。ds > 0 のパーティションを更新すると、マテリアライズドビューに対応する空のパーティションが作成されます。 ds=1 ds=2 SELECT * FROM mf_mv_blank_pts WHERE ds>0; --結果から、パーティション ds=1 のみにデータが含まれていることが分かります。 +------------+------------+------------+ | id | name | ds | +------------+------------+------------+ | 1 | aba | 1 | | 2 | cbd | 1 | +------------+------------+------------+
マテリアライズドビューの更新
ソーステーブルまたはパーティションのデータが変更されると、マテリアライズドビューは無効になり、クエリリライトに使用できなくなります。ビューのステータスを確認し、必要に応じて再構築してください。詳細については、「マテリアライズドビューに関する情報のクエリ」をご参照ください。
注意事項
再構築操作では、変更されたソーステーブルまたはパーティションのみが更新されます。
スケジュールされたリフレッシュを有効にして、データを自動的に更新できます。詳細については、「マテリアライズドビューのスケジュールされたリフレッシュ」をご参照ください。
構文
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> REBUILD [PARTITION (<ds>=max_pt(<table_name>),<expression>...)];パラメーター
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
更新するマテリアライズドビューの名前です。
ds
いいえ
マテリアライズドビューのパーティションフィールドの名前です。
max_pt
いいえ
指定されたテーブルまたはマテリアライズドビュー (
table_name) から最大のパーティション値を取得します。expression
いいえ
再構築するパーティションを指定する式です。パーティションマテリアライズドビューで使用します。
例
例 1:非パーティション化マテリアライズドビューの更新。
-- 非パーティション化テーブルを作成します。 CREATE TABLE count_test(a BIGINT, b BIGINT); -- 非パーティション化マテリアライズドビューを作成します。 CREATE MATERIALIZED VIEW count_mv LIFECYCLE 7 AS SELECT COUNT(*) FROM count_test; -- 非パーティション化マテリアライズドビューを更新します。 ALTER MATERIALIZED VIEW count_mv rebuild;例 2:マテリアライズドビューのパーティションの更新。
ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds='1');例 3:条件によるパーティションの更新。
ALTER MATERIALIZED VIEW mf_mv_blank_pts REBUILD PARTITION (ds>='1', ds<='2');例 4:最新パーティションの更新。
-- サンプルのパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS sale_detail_jt (shop_name STRING , customer_id STRING , total_price DOUBLE ) PARTITIONED BY (sale_date STRING ,region STRING ); ALTER TABLE sale_detail_jt ADD PARTITION (sale_date='2013',region='china'); INSERT INTO sale_detail_jt PARTITION (sale_date='2013',region='china') VALUES ('s1','c1',100.1), ('s2','c2',100.2), ('s3','c3',100.3); ALTER TABLE sale_detail_jt ADD PARTITION (sale_date='2013',region='en'); INSERT INTO sale_detail_jt PARTITION (sale_date='2013',region='en') VALUES ('t1','c5',200.0), ('t2','c6',300.0); -- パーティションデータを表示します。 SELECT * FROM sale_detail_jt WHERE sale_date='2013' AND region='china'; +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | s1 | c1 | 100.1 | 2013 | china | | s2 | c2 | 100.2 | 2013 | china | | s3 | c3 | 100.3 | 2013 | china | +-----------+-------------+-------------+-----------+--------+ -- パーティションデータを表示します。 SELECT * FROM sale_detail_jt WHERE sale_date='2013' AND region='en'; +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | t1 | c5 | 200.0 | 2013 | en | | t2 | c6 | 300.0 | 2013 | en | +-----------+-------------+-------------+-----------+--------+ -- マテリアライズドビューを作成します。 CREATE MATERIALIZED VIEW mv_deferred BUILD DEFERRED AS SELECT * FROM sale_detail_jt; -- マテリアライズドビュー mv_deferred をクエリします。 SELECT * FROM mv_deferred; -- 以下の結果が返されます: +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+ -- パーティションテーブルを作成します。 CREATE TABLE mf_part (id bigint,name string) PARTITIONED BY (dt string); -- データを挿入します。 INSERT INTO mf_part PARTITION(dt='2013') VALUES(1,'name1'),(2,'name2'); -- データをクエリします。 SELECT * FROM mf_part WHERE dt='2013'; -- 以下の結果が返されます: +------------+------+----+ | id | name | dt | +------------+------+----+ | 1 | name1 | 2013 | | 2 | name2 | 2013 | +------------+------+----+ -- パーティションマテリアライズドビューを作成します。 CREATE MATERIALIZED VIEW mv_rebuild BUILD DEFERRED PARTITIONED BY (dt) AS SELECT * FROM mf_part; -- マテリアライズドビューからデータをクエリします。 SELECT * FROM mv_rebuild WHERE dt='2013'; -- 以下の結果が返されます: +------------+------+----+ | id | name | dt | +------------+------+----+ +------------+------+----+ -- 最新のパーティションデータをリフレッシュします。 ALTER MATERIALIZED VIEW mv_rebuild REBUILD PARTITION(dt=max_pt('mf_part')); -- マテリアライズドビューからデータをクエリします。 SELECT * FROM mv_rebuild WHERE dt='2013'; -- 以下の結果が返されます: +------------+------+----+ | id | name | dt | +------------+------+----+ | 1 | name1 | 2013 | | 2 | name2 | 2013 | +------------+------+----+
マテリアライズドビューのライフサイクルの変更
既存のマテリアライズドビューのライフサイクルを変更します。
構文
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> SET LIFECYCLE <days>;パラメーター
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
変更するマテリアライズドビューの名前です。
days
はい
マテリアライズドビューの新しいライフサイクル (日数) です。
例
-- マテリアライズドビューのライフサイクルを 10 日に設定します。 ALTER MATERIALIZED VIEW count_mv SET LIFECYCLE 10;
マテリアライズドビューのライフサイクルの有効化または無効化
マテリアライズドビューのライフサイクル管理を有効化または無効化します。
構文
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> [PARTITION <pt_spec>] {enable|disable} LIFECYCLE;パラメーター
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
変更するマテリアライズドビューの名前です。
pt_spec
いいえ
変更するパーティションです。フォーマットは
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)です。ここで、partition_col はパーティション列、partition_col_value はその値です。enable|disable
はい
enableは有効、disableは無効を意味します。無効の場合、パーティションまたはテーブルはライフサイクル管理の対象になりません。例
例 1:マテリアライズドビューのパーティションのライフサイクル管理を有効化します。
ALTER MATERIALIZED VIEW mf_mv_blank_pts PARTITION (ds='1') enable LIFECYCLE;例 2:マテリアライズドビューのパーティションのライフサイクル管理を無効化します。
ALTER MATERIALIZED VIEW mf_mv_blank_pts PARTITION (ds='1') disable LIFECYCLE;
マテリアライズドビュー情報
スキーマや最終更新日時など、マテリアライズドビューの詳細を表示します。
構文
DESC EXTENDED [<project_name>.]<mv_name>;パラメーター
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
クエリするマテリアライズドビューの名前です。
例
DESC EXTENDED mv;このコマンドは次の出力を返します:
説明このサンプル出力は MaxCompute クライアント v0.43 以降でのみ利用可能です。詳細については、「odpscmd を使用して MaxCompute に接続する」をご参照ください。
+------------------------------------------------------------------------------------+ | Owner: ALIYUN$$****@***.aliyunid.com | | Project: m**** | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-05-30 13:16:07 | | LastDDLTime: 2023-05-30 13:16:07 | | LastModifiedTime: 2023-05-30 13:16:07 | +------------------------------------------------------------------------------------+ | MaterializedView: YES | | ViewText: select id,name from mf_refresh | | Rewrite Enabled: true | | AutoRefresh Enabled: true | | Refresh Interval Minutes: 10 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | id | bigint | | | true | NULL | | | name | STRING | | | true | NULL | | +------------------------------------------------------------------------------------+ | Extended Info: | +------------------------------------------------------------------------------------+ | IsOutdated: false | | TableID: 569ec712873e44b3868e79b7a8beabab | | IsArchived: false | | PhysicalSize: 1875 | | FileNum: 2 | | StoredAs: CFile | | CompressionStrategy: normal | | odps.timemachine.retention.days: 1 | | ColdStorageStatus: N/A | | encryption_enable: false | +------------------------------------------------------------------------------------+ | AutoRefresh History: | +------------------------------------------------------------------------------------+ | InstanceId | Status | StartTime | EndTime | +------------------------------------------------------------------------------------+ | 20230619070546735ghwl1****** | TERMINATED | 2023-06-19 15:05:46 | 2023-06-19 15:05:47 | | 20230619065545586gwllc****** | TERMINATED | 2023-06-19 14:55:45 | 2023-06-19 14:55:46 | | 20230619064544463gcjgom****** | TERMINATED | 2023-06-19 14:45:44 | 2023-06-19 14:45:45 | | 20230619063543334gzxs2d****** | TERMINATED | 2023-06-19 14:35:43 | 2023-06-19 14:35:44 | | 2023061906254257gi21w2****** | TERMINATED | 2023-06-19 14:25:42 | 2023-06-19 14:25:43 | | 20230619061540813giacg8****** | TERMINATED | 2023-06-19 14:15:41 | 2023-06-19 14:15:41 | | 20230619060539674gswjq9****** | TERMINATED | 2023-06-19 14:05:39 | 2023-06-19 14:05:40 | | 20230619055538578gvdjk****** | TERMINATED | 2023-06-19 13:55:38 | 2023-06-19 13:55:40 | | 20230619054537356glqdne****** | TERMINATED | 2023-06-19 13:45:37 | 2023-06-19 13:45:38 | | 2023061905353687gcc5pl****** | TERMINATED | 2023-06-19 13:35:36 | 2023-06-19 13:35:37 | +------------------------------------------------------------------------------------+
マテリアライズドビューのステータス照会
マテリアライズドビューのステータスを照会し、有効かどうかを確認します。マテリアライズドビューには、次のいずれかの状態があります:
有効
MaxCompute は、ソーステーブルではなく、マテリアライズドビューから直接データを読み取ります。
無効
MaxCompute は、マテリアライズドビューからデータを読み取ることができません。クエリはソーステーブルにフォールバックし、パフォーマンスは高速化されません。
マテリアライズドビューのデータが有効かどうかを確認するには、次の関数を使用します:
構文
boolean materialized_view_is_valid(<mv_name>,<partition_value>);例
マテリアライズドビューのデータがソーステーブルの最新データと一貫性があるかどうかを判定します。データに一貫性がある場合、この関数は
trueを返し、そうでない場合はfalseを返します。SELECT materialized_view_is_valid("count_mv");SELECT materialized_view_is_valid("mf_mv_blank_pts","1");
マテリアライズドビューの一覧表示
プロジェクト内のすべてのマテリアライズドビュー、または特定のパターンに一致するマテリアライズドビューのみを一覧表示します。
SHOW MATERIALIZED VIEWS コマンドを使用するには、MaxCompute クライアント (odpscmd) v0.43.0 以降が必要です。
構文
-- プロジェクト内のすべてのマテリアライズドビューを一覧表示します。 SHOW MATERIALIZED VIEWS; -- プロジェクト内で <materialized_view> パターンに一致するマテリアライズドビューを一覧表示します。 SHOW MATERIALIZED VIEWS LIKE '<materialized_view>';例
-- 'test' で始まるマテリアライズドビューを一覧表示します。アスタリスク (*) はワイルドカードです。 SHOW MATERIALIZED VIEWS LIKE 'test*';このコマンドは次の結果を返します:
ALIYUN$account_name:test_two_mv ALIYUN$account_name:test_create_one_mv
マテリアライズドビューの削除
マテリアライズドビューを削除します。
構文
DROP MATERIALIZED VIEW [IF EXISTS] [<project_name>.]<mv_name> [purge];パラメーター
パラメーター
必須
説明
IF EXISTS
いいえ
IF EXISTS を指定しないと、マテリアライズドビューが存在しない場合にこの操作はエラーを返します。
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
削除するマテリアライズドビューの名前です。
purge
いいえ
purgeを指定すると、この操作はマテリアライズドビューのデータを直ちに消去します。例
マテリアライズドビュー
count_mvをドロップします。DROP MATERIALIZED VIEW count_mv;マテリアライズドビュー
count_mvをドロップし、そのデータを直ちに削除します。DROP MATERIALIZED VIEW count_mv purge;
マテリアライズドビューからのパーティションの削除
既存のマテリアライズドビューから 1 つ以上のパーティションを削除します。
構文
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> DROP [IF EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec>, PARTITION <pt_spec>....];パラメーター
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前です。このパラメーターを省略すると、現在のプロジェクトが使用されます。プロジェクト名を確認するには、MaxCompute コンソールにログインし、リージョンを選択してから、ワークスペース > プロジェクト管理 に移動します。
mv_name
はい
パーティションを削除するパーティション化されたマテリアライズドビューの名前です。
IF EXISTS
いいえ
IF EXISTS を省略し、マテリアライズドビューが存在しない場合、エラーが返されます。
pt_spec
はい
ドロップするパーティションを少なくとも 1 つ指定する必要があります。形式は
(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)です。partition_col はパーティション列を、partition_col_value はパーティション値を表します。例
例 1:パーティション化されたマテリアライズドビューからのパーティションの削除
ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds='1');例 2:パーティション化されたマテリアライズドビューから、指定した条件を満たすパーティションの削除
ALTER MATERIALIZED VIEW mf_mv_blank_pts DROP PARTITION (ds>='1' AND ds<='2');
マテリアライズドビューのクエリペネトレーション
パーティション化されたマテリアライズドビューには、すべてのパーティションのデータが含まれていない場合があります。たとえば、最新のパーティションのみをリフレッシュした場合などです。クエリがマテリアライズドビューにデータがないパーティションを対象とする場合、システムは自動的にソースパーティションテーブルにフォールバックします。次の図は、このプロセスを示しています。

マテリアライズドビューのペネトレーションクエリ機能を有効にするには、次のパラメーターを設定します。
マテリアライズドビューを作成する際に、tblproperties に "enable_auto_substitute"="true" を追加します。
次の例では、ペネトレーションクエリに対応したマテリアライズドビューの使用方法を説明します。
ペネトレーションクエリに対応したパーティション化されたマテリアライズドビューを作成します。
-- src という名前のソーステーブルを作成します。 CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string); -- パーティション 20210101 にデータを挿入します。 INSERT INTO src PARTITION(dt='20210101') VALUES(1,'田中'); -- ペネトレーションクエリに対応したパーティション化マテリアライズドビューを作成します。 -- この時点では、ソーステーブルの 20210101 パーティションのデータのみがマテリアライズされます。 CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 PARTITIONED BY (dt) tblproperties("enable_auto_substitute"="true") AS SELECT id, name, dt FROM src; -- ソーステーブルに新しいパーティション 20210102 を追加します。 -- このパーティションは、まだマテリアライズドビューにリフレッシュされていません。 INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink');マテリアライズドビュー
mvの20210101パーティションからデータをクエリします。SELECT * FROM mv WHERE dt='20210101';マテリアライズドビュー
mvの20210102パーティションからデータをクエリすると、このパーティションはマテリアライズされていないため、システムはソーステーブルへのクエリを自動的に実行します。SELECT * FROM mv WHERE dt = '20210102'; -- 20210102 パーティションのデータはマテリアライズされていないため、クエリはソーステーブルにアクセスするように書き換えられます。これは、次のクエリと等価です。 SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;マテリアライズドビュー
mvのパーティション範囲からデータをクエリします。システムは、マテリアライズ化されていないデータに対してソーステーブルへの透過的なクエリを自動的に実行し、その結果をUNION操作でマテリアライズドデータと結合した上で返します。SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id=5; -- パーティション 20201230 と 20210102 のデータはマテリアライズされていないため、クエリはソーステーブルにアクセスするように書き換えられます。これは、次のクエリと等価です。 SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20201230' OR dt='20210102' UNION ALL SELECT * FROM mv WHERE dt='20210101' ) t WHERE id = 5;
課金ルール
マテリアライズドビューのコストは、次の 2 つの要素で構成されています:
ストレージ料金
マテリアライズドビューは物理ストレージを消費するため、従量課金でストレージ料金が発生します。詳細については、「ストレージ料金 (従量課金)」をご参照ください。
コンピューティングコスト
マテリアライズドビューの作成、リフレッシュ、クエリ (ビューが有効な場合のクエリリライトを含む) ではコンピューティングリソースを消費するため、コンピューティングコストが発生します。
MaxCompute プロジェクトが サブスクリプションの場合、追加料金は発生しません。
MaxCompute プロジェクトが 従量課金の場合、MaxCompute は SQL の複雑さと入力データ量に基づいてコストを算出します。詳細については、「Standard SQL pricing」をご参照ください。次の点にご注意ください:
マテリアライズドビューのリフレッシュに使用される SQL ステートメントは、その定義クエリと同じです。プロジェクトがサブスクリプションのコンピューティングリソースグループにバインドされている場合、この操作では購入済みのリソースが追加料金なしで使用されます。プロジェクトが従量課金のリソースグループを使用している場合、コストは入力データ量と SQL の複雑さによって決まります。リフレッシュ後、ストレージ料金はマテリアライズドビューの実際のサイズに基づいて請求されます。
マテリアライズドビューが有効な場合、クエリリライトはビューからデータを読み取ります。入力データ量はソーステーブルではなくマテリアライズドビューに依存します。ビューが無効な場合、クエリリライトは使用できず、クエリはソーステーブルから直接読み取ります。詳細については、「マテリアライズドビューのステータスのクエリ」をご参照ください。
マテリアライズドビューが複数テーブル結合から構築される場合、データ肥大化が発生することがあります。マテリアライズドビューからの読み取りは、ソーステーブルからの読み取りと比べて、常にコストを削減できるとは限りません。
リファレンス
マテリアライズドビューのクエリリライトについては、「マテリアライズドビューのクエリリライト」をご参照ください。
マテリアライズドビューの定期更新については、「マテリアライズドビューの定期更新」をご参照ください。