マテリアライズドビューは、JOIN や AGGREGATE などの時間のかかるクエリの事前計算結果を格納するデータベースオブジェクトです。同じクエリを実行する場合、事前計算結果を直接再利用できます。これにより、クエリの速度が向上します。
背景情報
ビューは、仮想テーブルとしてアクセスできる保存されたクエリです。ビューをクエリするたびに、クエリ文はビューを定義するために使用された SQL 文に変換されます。マテリアライズドビューは、実際のデータを格納するためにストレージリソースを占有する特別な物理テーブルです。マテリアライズドビューの課金ルールについては、このトピックの課金ルールセクションをご参照ください。
マテリアライズドビューは、以下のクエリに適しています。
固定モードで頻繁に実行されるクエリ
JOIN や AGGREGATE などの時間のかかる操作を含むクエリ
テーブル内のデータのごく一部のみを含むクエリ
次の表は、従来のクエリとマテリアライズドビューに基づくクエリを比較したものです。
比較項目 | 従来のクエリ | マテリアライズドビューに基づくクエリ |
クエリ文 | SQL 文を使用してデータをクエリします。 | 作成したマテリアライズドビューに基づいてデータをクエリします。 マテリアライズドビューを作成するために使用される文: 作成したマテリアライズドビューに基づいてデータをクエリするために使用される文: マテリアライズドビューのクエリ書き換え機能が有効になっている場合、次のコードの最初の SQL 文を実行すると、マテリアライズドビューに含まれるクエリ結果からデータが直接取得されます。 |
クエリ特性 | クエリには、テーブルの読み取り、JOIN、およびフィルター (WHERE 句) 操作が含まれます。ソーステーブルに大量のデータが含まれている場合、クエリ速度は遅くなります。クエリ操作は複雑で、クエリ効率は低くなります。 | クエリには、テーブルの読み取りとフィルター操作が含まれます。JOIN 操作は含まれません。MaxCompute は最適なマテリアライズドビューを自動的に一致させ、最適なマテリアライズドビューからデータを読み取ります。これにより、クエリ効率が大幅に向上します。 |
操作
操作 | 説明 | 承認済みユーザー | 操作プラットフォーム |
クエリ文に基づいてマテリアライズドビューを作成します。 | プロジェクトで CreateTable 権限を持つユーザー | 以下のプラットフォームを使用して操作を実行できます。 | |
既存のマテリアライズドビューを更新します。 | テーブルに対する Alter 権限を持つユーザー | ||
既存のマテリアライズドビューのライフサイクルを変更します。 | テーブルに対する Alter 権限を持つユーザー | ||
既存のマテリアライズドビューのライフサイクル機能を有効または無効にします。 | テーブルに対する Alter 権限を持つユーザー | ||
マテリアライズドビューに関する基本情報をクエリします。 | テーブルのメタデータに対する Describe 権限を持つユーザー | ||
マテリアライズドビューのステータスをクエリします。 | テーブルのメタデータに対する Describe 権限を持つユーザー | ||
プロジェクト内のすべてのマテリアライズドビュー、または特定のルールを満たすマテリアライズドビューを一覧表示します。 | プロジェクト内のオブジェクトのリストを表示するための List 権限を持つユーザー | ||
既存のマテリアライズドビューを削除します。 | テーブルに対する Drop 権限を持つユーザー | ||
既存のマテリアライズドビューからパーティションを削除します。 | テーブルに対する Drop 権限を持つユーザー | ||
クエリするパーティションデータがマテリアライズドビューに含まれていない場合は、ソースのパーティションテーブルからデータをクエリします。 | プロジェクトで Write および CreateTable 権限を持つユーザー | ||
共通クエリをマテリアライズドビューからのクエリに書き換えます。 | プロジェクトで Write および CreateTable 権限を持つユーザー | ||
既存のマテリアライズドビューのデータに対してスケジュールされた更新を実行します。 | テーブルに対する 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 プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。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
いいえ
作成するマテリアライズドビューのシャッフル属性。クラスター化されたマテリアライズドビューを作成する場合は、clustered by または range clustered by パラメーターを指定する必要があります。
SORTED BY
いいえ
作成するマテリアライズドビューのソート属性。クラスター化されたマテリアライズドビューを作成する場合は、このパラメーターを設定する必要があります。
REFRESH EVERY
いいえ
マテリアライズドビューのスケジュールされた更新間隔を設定します。使用可能な単位は、分、時間、または日です。
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 文の構文の詳細については、SELECT 構文をご参照ください。
例
例 1: マテリアライズドビューを作成します。
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,'kyle'),(2,20,'xia'); SELECT * FROM mf_t WHERE ds ='1'; -- 以下の結果が返されます。 +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 2 | 20 | xia | 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,'kyle'),(3,20,'john'); SELECT * FROM mf_t1 WHERE ds ='1'; -- 以下の結果が返されます。 +------------+------------+------------+------------+ | id | value | name | ds | +------------+------------+------------+------------+ | 1 | 10 | kyle | 1 | | 3 | 20 | john | 1 | +------------+------------+------------+------------+マテリアライズドビューを作成します。
サンプル 1: ds という名前のパーティションキー列を含むマテリアライズドビューを作成します。
CREATE MATERIALIZED VIEW mf_mv LIFECYCLE 7 ( key comment 'unique id', value comment 'input value', ds comment 'partitiion' ) 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 を含む ALTER 文を実行すると、マテリアライズドビューに空のパーティションが生成されます。 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>),<expression1>...)];次の表は、コードのパラメーターについて説明しています。
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前。このパラメーターを設定しない場合、現在の MaxCompute プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。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 | | s5 | c2 | 100.2 | 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 ON (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 プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。MaxCompute コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。
mv_name
はい
更新するマテリアライズドビューの名前。
days
はい
マテリアライズドビューの新しいライフサイクル。単位: 日。
例
-- 既存のマテリアライズドビューのライフサイクルを 10 日に変更します。 ALTER MATERIALIZED VIEW count_mv SET LIFECYCLE 10;
既存のマテリアライズドビューのライフサイクル機能を有効または無効にする
既存のマテリアライズドビューのライフサイクル機能を有効または無効にすることができます。
構文
ALTER MATERIALIZED VIEW [<project_name>.]<mv_name> [<pt_spec>] enable|disable LIFECYCLE;次の表は、コードのパラメーターについて説明しています。
パラメーター
必須
説明
project_name
いいえ
マテリアライズドビューが属する MaxCompute プロジェクトの名前。このパラメーターを設定しない場合、現在の MaxCompute プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。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 プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。MaxCompute コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。
mv_name
はい
クエリするマテリアライズドビューの名前。
例
DESC EXTENDED mv;次のコードは、クエリの結果例を示しています。
説明次の結果例は、MaxCompute クライアントのバージョンが V0.43 以降の場合にのみ返されます。詳細については、MaxCompute クライアント (odpscmd) の「バージョンの更新」セクションをご参照ください。
+------------------------------------------------------------------------------------+ | 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 はマテリアライズドビューから直接データをクエリできません。この場合、MaxCompute はソーステーブルからデータをクエリします。その結果、クエリ速度は向上しません。
関数を使用して、マテリアライズドビューのデータが有効かどうかを確認できます。
構文
boolean materialized_view_is_valid(<mv_name>,<partition_value>);例
マテリアライズドビュー mf_mv_refresh4 のデータがソーステーブルの最新データと一致するかどうかを確認します。データが一致する場合、
trueが返されます。そうでない場合、falseが返されます。SELECT materialized_view_is_valid("count_mv");SELECT materialized_view_is_valid("mf_mv_blank_pts","1");
プロジェクト内のすべてのマテリアライズドビューを一覧表示する
プロジェクト内のすべてのマテリアライズドビュー、または特定のルールを満たすマテリアライズドビューを一覧表示します。
SHOW MATERIALIZED VIEWS コマンドには、バージョン 0.43.0 以降の MaxCompute クライアント (odpscmd) が必要です。
構文
--プロジェクト内のすべてのマテリアライズドビューを一覧表示します。 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 プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。MaxCompute コンソール にログオンします。上部のナビゲーションバーで、リージョンを選択します。[ワークスペース] > [プロジェクト] ページで MaxCompute プロジェクトの名前を表示します。
mv_name
はい
削除するマテリアライズドビューの名前。
purge
いいえ
purgeパラメーターを指定すると、マテリアライズドビューを削除するときにマテリアライズドビューのデータが削除されます。例
mvマテリアライズドビューを削除します。DROP MATERIALIZED VIEW count_mv;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 プロジェクトが使用されます。MaxCompute プロジェクトの名前を表示するには、次の手順を実行します。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');
マテリアライズドビューでペネトレーションクエリを実行する
パーティション化されたマテリアライズドビューには、最新のパーティションデータのみがパーティション化されたマテリアライズドビューに更新される場合、ソースのパーティションテーブルのすべてのパーティションのデータは含まれません。クエリするパーティションデータがパーティション化されたマテリアライズドビューに存在しない場合、システムはペネトレーションクエリを実行して、ソースのパーティションテーブルからデータをクエリします。次の図は、ペネトレーションクエリを実行する方法を示しています。

マテリアライズドビューがペネトレーションクエリをサポートできるようにするには、次のパラメーターを設定する必要があります。
マテリアライズドビューを作成するときに、"enable_auto_substitute"="true" を tblproperties に追加します。
次の例は、マテリアライズドビューに基づいてペネトレーションクエリを実行する方法を示しています。
ペネトレーションクエリをサポートするパーティション化されたマテリアライズドビューを作成します。
-- src という名前のテーブルを作成します。 CREATE TABLE src(id bigint,name string) PARTITIONED BY (dt string); -- テーブルにデータを挿入します。 INSERT INTO src PARTITION(dt='20210101') VALUES(1,'Alex'); INSERT INTO src PARTITION(dt='20210102') VALUES(2,'Flink'); -- ペネトレーションクエリをサポートするパーティション化されたマテリアライズドビューを作成します。 CREATE MATERIALIZED VIEW IF NOT EXISTS mv LIFECYCLE 7 PARTITIONED BY (dt) tblproperties("enable_auto_substitute"="true") AS SELECT id, name, dt FROM src;mv マテリアライズドビューから src テーブルの 20210101 パーティションのデータをクエリします。
SELECT * FROM mv WHERE dt='20210101';mv マテリアライズドビューから src テーブルの 20210102 パーティションのデータをクエリします。mv マテリアライズドビューにはパーティションデータが含まれていません。したがって、ペネトレーションクエリが実行され、src テーブルからパーティションデータがクエリされます。
SELECT * FROM mv WHERE dt = '20210102'; -- mv マテリアライズドビューには 20210102 パーティションのデータが含まれておらず、src テーブルからパーティションデータをクエリする必要があるため、前の文は次の文と同じです。 SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20210102') t;mv マテリアライズドビューから 20201230 から 20210102 までのパーティションのデータをクエリします。mv マテリアライズドビューにはすべてのパーティションデータが含まれていません。したがって、ペネトレーションクエリが実行され、mv マテリアライズドビューに含まれていないデータが取得され、取得されたデータと mv マテリアライズドビューからクエリされたデータに対して UNION 操作が実行されて、最終結果が返されます。
SELECT * FROM mv WHERE dt >= '20201230' AND dt<='20210102' AND id='5'; -- mv マテリアライズドビューには 20210102 パーティションのデータが含まれておらず、ペネトレーションクエリが実行され、ソーステーブルから 20210102 パーティションのデータがクエリされます。前の文は次の文と同じです。 SELECT * FROM (SELECT id, name, dt FROM src WHERE dt='20211231' OR dt='20210102' UNION ALL SELECT * FROM mv WHERE dt='20210101' ) t WHERE id = '5';
課金ルール
マテリアライズドビューを使用する場合、以下の項目に対して課金されます。
ストレージ
マテリアライズドビューは物理ストレージを占有します。マテリアライズドビューによって占有される物理ストレージに対して課金されます。ストレージの価格設定の詳細については、ストレージの価格設定 (従量課金) をご参照ください。
コンピューティング
マテリアライズドビューの作成、更新、クエリ、およびクエリの書き換え (マテリアライズドビューが有効な場合) 時には、データがクエリされます。これらの操作は計算リソースを消費し、計算コストを発生させます。
MaxCompute プロジェクトでサブスクリプション課金方式 を使用している場合、追加の計算コストは発生しません。
MaxCompute プロジェクトで従量課金制課金方式 を使用している場合、料金は SQL の複雑さと入力データ量に基づいて計算されます。課金の詳細については、コンピューティングの価格設定 の「標準 SQL ジョブの課金」セクションをご参照ください。以下の点にご注意ください。
マテリアライズドビューを更新するために使用される SQL 文は、マテリアライズドビューを作成するために使用される SQL 文と同じです。マテリアライズドビューが属するプロジェクトがサブスクリプションリソースグループにバインドされている場合、購入したサブスクリプションリソースが使用され、追加料金は発生しません。プロジェクトが従量課金制リソースグループにバインドされている場合、料金は入力データ量と SQL 文の複雑さによって異なります。マテリアライズドビューを更新した後、使用されているストレージ容量に基づいてストレージ料金が課金されます。
マテリアライズドビューが有効な場合、クエリ書き換え操作が実行されると、マテリアライズドビューからデータが読み取られます。クエリ文のマテリアライズドビューから読み取られる入力データ量は、マテリアライズドビューに関連しており、マテリアライズドビューのソーステーブルとは無関係です。マテリアライズドビューが無効な場合、クエリ書き換え操作を実行できず、ソーステーブルからデータがクエリされます。クエリ文の入力データ量は、ソーステーブルに関連しています。マテリアライズドビューのステータスをクエリする方法の詳細については、このトピックの マテリアライズドビューのステータスをクエリする をご参照ください。
複数のテーブルの関連付けに基づいてマテリアライズドビューが生成される場合、データの肥大化が発生する可能性があります。したがって、マテリアライズドビューによって読み取られるデータ量は、ソーステーブルのデータ量よりも必ずしも少ないとは限りません。MaxCompute は、マテリアライズドビューからのデータ読み取りのコストがソーステーブルからのデータ読み取りのコストよりも少ないことを保証できません。
参考資料
共通クエリをマテリアライズドビューからのクエリに書き換える方法の詳細については、マテリアライズドビューのクエリと書き換え をご参照ください。
マテリアライズドビューのスケジュールされた更新機能の詳細については、マテリアライズドビューのスケジュールされた更新 をご参照ください。