MaxCompute は、標準 (Standard)、低頻度アクセス (IA)、アーカイブ (Archive) の 3 つのストレージ階層をサポートしています。デフォルトでは、データは標準階層に保存されます。データアクセス頻度に基づき、特定のテーブルまたはパーティションのストレージ階層を IA またはアーカイブに設定することで、ホットデータとコールドデータの階層型ストレージを実装し、データストレージコストを削減できます。
ストレージ階層
ストレージ階層 | 説明 |
標準 (Standard) | デフォルトのストレージ階層です。この階層は、データが頻繁にアクセスされ、頻繁な読み取りおよび書き込み操作が必要なシナリオに適しています。 |
IA | 頻繁にアクセスされないデータに適しています。これにより、ストレージコストを効果的に削減できます。 説明
|
アーカイブ (Archive) |
階層型ストレージの課金
ストレージ課金の詳細については、「ストレージ料金」をご参照ください。
テーブルまたはパーティションが IA またはアーカイブストレージ階層に設定されている場合、データ量とアクセス頻度を考慮してください。大量のデータにアクセスしたり、データアクセスが頻繁に行われたりすると、発生する料金が標準ストレージ階層の料金よりも高くなる可能性があります。
IA ストレージ階層にあるテーブルまたはパーティションの全データに月に 1 回アクセスするコストは、そのデータが標準ストレージ階層にある場合のストレージコストと同等です。
アーカイブストレージ階層にあるテーブルまたはパーティションの全データに 6 ヶ月に 1 回アクセスするコストは、そのデータが標準ストレージ階層にある場合のストレージコストと同等です。
費用とコストにログインします。 ページで、異なるストレージクラスのコストを確認できます。標準ストレージ、IA ストレージ、アーカイブストレージの課金項目は、それぞれ「ストレージ」、「階層型ストレージ-IA」、「長期ストレージ」と名付けられています。詳細については、「請求詳細の表示」をご参照ください。
適用範囲
リージョン制限:中国 (杭州)、中国 (上海)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (成都)、中国 (香港)、中国東部 2 Finance、中国北部 2 Finance、中国南部 1 Finance、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、日本 (東京)、ドイツ (フランクフルト)、および米国 (シリコンバレー)。
IA およびアーカイブストレージ階層のデータは Hologres から直接アクセスすることはできません。Hologres が MaxCompute から直接データを読み取る際、MaxCompute のテーブルまたはパーティションの `last_access_time` は更新されません。そのため、
last_access_time条件に基づいて階層型ストレージのライフサイクルルールを設定した場合、Hologres によってのみ継続的に読み取られる一部のテーブルやパーティションもルールに一致する可能性があります。
ストレージ階層の設定
ストレージ階層間でデータを変換できます。ストレージ階層の変更はデータアクセスに影響しません。
このセクションでは、ストレージクラスの変換について説明します。
変換 | 説明 |
標準から IA へ | 手動および自動変換をサポートします。I/O アクセス料金は発生しません。テーブルまたはパーティションの最終データ更新時刻と最終データアクセス時刻は更新されません。 |
標準からアーカイブへ | |
IA からアーカイブへ | 手動および自動変換をサポートします。手動変換では I/O アクセス料金が発生しますが、自動変換では発生しません。テーブルまたはパーティションの最終データ更新時刻と最終データアクセス時刻は更新されません。 |
IA から標準へ | 手動変換のみをサポートします。I/O アクセス料金が発生します。テーブルまたはパーティションの最終データ更新時刻と最終データアクセス時刻は更新されます。 |
アーカイブから IA へ | |
アーカイブから標準へ |
手動でのカスタム設定
非パーティションテーブルまたはパーティションのストレージ階層を IA またはアーカイブに手動で設定できます。設定はすぐに有効になります。
コマンド形式
ALTER TABLE <TABLE_NAME> [PARTITION(<PARTITION_SPEC>)]
SET <TBLPROPERTIES|PARTITIONPROPERTIES>("storagetier"="standard|lowfrequency|longterm");パラメーターの説明
TABLE_NAME:必須。ストレージ階層を変更したいテーブルまたはパーティションテーブルの名前。
PARTITION_SPEC:パーティションのストレージ階層を変更する場合に必須。
TBLPROPERTIES|PARTITIONPROPERTIES:テーブルまたはパーティションのストレージ階層を変更します。有効な値:
TBLPROPERTIES:テーブルのストレージ階層を変更します。
PARTITIONPROPERTIES:パーティションのストレージ階層を変更します。
storagetier:必須。ストレージ階層。有効な値:
standard:標準ストレージ。ストレージ料金のみが課金されます。
lowfrequency:IA ストレージ。IA ストレージのストレージ料金とデータアクセス料金が課金されます。
longterm:アーカイブストレージ。アーカイブストレージのストレージ料金とデータアクセス料金が課金されます。
パーティションテーブルの場合、テーブル自体ではなく、そのパーティションに対してのみストレージ階層を設定できます。
使用例
例 1:非パーティションテーブルのストレージ階層を IA に設定します。
ALTER TABLE tablename SET TBLPROPERTIES("storagetier"="lowfrequency");テーブルプロパティを表示します。
StorageTierフィールドで現在のストレージ階層を確認できます。--テーブルプロパティの表示 DESC extended tablename; ---以下の結果が返されます: +-------------------------------------------------------------------+ | Owner: ALIYUN$mofan_****@test.aliyunid.com | | Project: mf_mc_**** | | TableComment: | +-------------------------------------------------------------------+ | CreateTime: 2021-11-18 15:14:00 | | LastDDLTime: 2023-09-11 14:34:55 | | LastModifiedTime: 2023-09-13 15:02:28 | | LastAccessTime: 2023-09-14 10:50:57 | +-------------------------------------------------------------------+ | InternalTable: YES | Size: 1923683131 | +-------------------------------------------------------------------+ | Native Columns: | +-------------------------------------------------------------------+ | Field| Type| Label |ExtendedLabel| Nullable| DefaultValue|Comment | +-------------------------------------------------------------------+ | empno | bigint | | | true | NULL | | | ename | string | | | true | NULL | | | job | string | | | true | NULL | | | mgr | bigint | | | true | NULL | | | hiredate | datetime | | | true | NULL | | | sal | bigint | | | true | NULL | | | comm | bigint | | | true | NULL | | | deptno | bigint | | | true | NULL | | +-------------------------------------------------------------------+ | Extended Info: | +-------------------------------------------------------------------+ | TableID: 8e0cc78c81ab4ad7af30bff7a8e**** | | IsArchived: false | | PhysicalSize: 5771049393 | | FileNum: 3 | | StoredAs: AliOrc | | CompressionStrategy: normal | | odps.timemachine.retention.days: 1 | | ColdStorageStatus: N/A | | encryption_enable: false | | StorageTier: lowfrequency | | StorageTierLastModifiedTime: 2023-09-11 14:34:55 | +-------------------------------------------------------------------+例 2:bank_data_pt パーティションテーブルの指定されたパーティションのストレージ階層を IA に設定します。
ALTER TABLE bank_data_pt PARTITION (credit='yes') SET PARTITIONPROPERTIES ("storagetier" = 'lowfrequency');パーティションプロパティを表示します。
StorageTierフィールドで現在のストレージ階層を確認できます。--パーティションプロパティの表示 DESC extended bank_data_pt PARTITION(credit='yes'); --以下の結果が返されます: +------------------------------------------------------------------------------------+ | PartitionSize: 0 | +------------------------------------------------------------------------------------+ | CreateTime: 2024-05-10 10:28:16 | | LastDDLTime: 2024-05-10 10:31:01 | | LastModifiedTime: 2024-05-10 10:28:16 | +------------------------------------------------------------------------------------+ | IsExstore: false | | IsArchived: false | | PhysicalSize: 0 | | FileNum: 0 | | ColdStorageStatus: N/A | | StorageTier: LowFrequency | | StorageTierLastModifiedTime: 2024-05-10 10:31:01 | +------------------------------------------------------------------------------------+
ライフサイクルルールを使用した自動設定
プロジェクトまたはパーティションテーブルレベルで階層型ストレージのライフサイクルルールを設定できます。システムはこれらのルールに基づいてストレージ階層を自動的に変換します。
プロジェクトレベルの設定:
設定後、このルールはプロジェクト内のすべての非パーティションテーブル、および特定のルールが定義されていないパーティションテーブルのパーティションに対するデフォルトルールとして機能します。これらのテーブルとパーティションは、対応するストレージ階層に自動的に変換されます。
パーティションテーブルレベルの設定:
パーティションテーブルに特定のルールが設定されると、それはプロジェクトレベルのルールよりも優先されます。テーブル内のすべてのパーティションがルールに一致する場合、そのパーティションは対応するストレージ階層に自動的に変換されます。
重要な制限事項
より細かい粒度でルールを設定することはできません:
単一の非パーティションテーブルに独立したルールを設定することはできません。それはプロジェクトルールを継承します。
パーティションテーブル内の特定のパーティションに独立したルールを設定することはできません。それは親のパーティションテーブルのルールを継承します。
ルールの実行
テーブルまたはパーティションがアーカイブストレージ (`longterm`) ルールと IA ストレージ (`lowfrequency`) ルールの両方に一致する場合、優先的に
longtermに変換されます。テーブルまたはパーティションのライフサイクルが最初に
lowfrequencyルールに一致した場合、lowfrequency階層に変換されます。その後、longtermルールに一致した場合、longterm階層に変換されます。lowfrequencyからlongtermへの変換中、lowfrequency階層に対するアクセス料金は課金されません。課金の詳細については、「階層型ストレージの課金」をご参照ください。プラットフォームは 1 日に 2 回ルールをスキャンします。そのため、条件に一致した直後に変換が実行されず、遅延が発生する場合があります。
コマンド形式
プロジェクトレベルでライフサイクルルールを設定する
SETPROJECT odps.table.lifecycle.config=<lifecycle_config_json_string>;MaxCompute コンソールでルールを次のように設定することもできます:
MaxCompute コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
プロジェクト管理 ページで、対象のプロジェクトを見つけ、操作 列の 管理 をクリックします。
プロジェクト設定 ページで、パラメーター設定 タブを選択できます。
ライフサイクル設定 セクションで、編集 をクリックします。
最近のアクセス設定ポリシー と 最近変更された設定ポリシー パラメーターを設定します。
最近のアクセス設定ポリシー:
DaysAfterLastAccessGreaterThanパラメーターに対応します。最近変更された設定ポリシー:
DaysAfterLastModificationGreaterThanパラメーターに対応します。
パーティションテーブルのライフサイクルルールを設定する
パーティションテーブル作成時にルールを設定する:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> [PRIMARY KEY (<pk_col_name>, <pk_col_name2>),(<col_name> <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...)] PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...) tblproperties ('lifecycle_config' = '<lifecycle_config_json_string>') ;パーティションテーブルのルールを変更する:
ALTER TABLE <TABLE_NAME> SET TBLPROPERTIES ('lifecycle_config' = '<lifecycle_config_json_string>');
パーティションテーブルの階層型ストレージのライフサイクルルール設定を表示する
SHOW CREATE TABLE <table_name>;
パラメーターの説明
以下の表は主要なパラメーターを説明しています。詳細については、「一般パラメーター」をご参照ください。
lifecycle_config_json_string:
プロジェクトレベルで設定されたライフサイクルルールは次のように定義されます。
{ "TierToLowFrequency": { "DaysAfterLastModificationGreaterThan": <days>, // 最終変更後の日数 "DaysAfterLastAccessGreaterThan": <days>, // 最終アクセス後の日数 }, "TierToLongterm": { "DaysAfterLastModificationGreaterThan": <days>, "DaysAfterLastAccessGreaterThan": <days> } // 各条件はオプションです。複数の条件は OR 関係にあります。 }以下のコードは、パーティションテーブルのライフサイクルルールの定義を示しています。
{ \"TierToLowFrequency\": { \"DaysAfterLastModificationGreaterThan\": <days>, // 最終変更後の日数 \"DaysAfterLastAccessGreaterThan\": <days>, // 最終アクセス後の日数 }, \"TierToLongterm\": { \"DaysAfterLastModificationGreaterThan\": <days>, \"DaysAfterLastAccessGreaterThan\": <days> } // 各条件はオプションです。複数の条件は OR 関係にあります。 }TierToLowFrequency:IA ストレージ階層の識別子。
TierToLongterm:アーカイブストレージ階層の識別子。
DaysAfterLastModificationGreaterThan:自動変換をトリガーする最終データ変更時刻からの日数。この値は、テーブルまたはパーティションの `LastModifiedTime` に対応します。
DaysAfterLastAccessGreaterThan:自動変換をトリガーする最終データアクセス時刻からの日数。テーブルまたはパーティションの `LastAccessTime` が空の場合:
2023 年 10 月 1 日より前に作成されたテーブルまたはパーティションの場合、時刻はデフォルトで UTC+0 タイムゾーンの
2023-10-01 00:00:00に基づいて計算されます。2023 年 10 月 1 日以降に作成されたテーブルまたはパーティションで、データがアクセスされていない場合、時刻は CreateTime に基づいて計算されます。
使用例
例 1:プロジェクトレベルでライフサイクルルールを設定します。
setproject odps.table.lifecycle.config={"TierToLongterm":{"DaysAfterLastAccessGreaterThan":180},"TierToLowFrequency":{"DaysAfterLastAccessGreaterThan":120}};例 2:プロジェクトレベルのライフサイクル設定をキャンセルします。
setproject odps.table.lifecycle.config=;例 3:パーティションテーブルにライフサイクルルールを設定します。
--パーティションテーブル作成時にルールを設定します。 CREATE TABLE lifecycle_part_t (key string) PARTITIONED BY (ds STRING) tblproperties ('lifecycle_config' = '{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 2,\"DaysAfterLastAccessGreaterThan\": 2},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 4,\"DaysAfterLastAccessGreaterThan\": 7}}') ; --パーティションテーブルのルールを変更します。 ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 90,\"DaysAfterLastAccessGreaterThan\": 30},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 180,\"DaysAfterLastAccessGreaterThan\": 7}}');例 4:パーティションテーブルの階層型ストレージのライフサイクル設定をキャンセルします。
ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{}');
階層型ストレージデータへのアクセス権限の設定
IA またはアーカイブストレージ階層のデータにアクセスするとアクセス料金が発生します。GET_PARTITION_META 関数と行レベルのアクセス制御を併用して、IA またはアーカイブストレージ階層のデータへのアクセス権限を管理し、アクセスを効果的に制御できます。
GET_PARTITION_META
GET_PARTITION_META は特殊な関数であり、行レベルのアクセス制御でのみ使用できます。通常の SQL クエリでは使用できません。
構文
struct GET_PARTITION_META(<tableName>, <pt_col1>, <pt_col2>, ..., <pt_col_n>);パラメーターの説明
パラメーター | 説明 |
tableName | テーブルの名前。テーブルはパーティションテーブルである必要があります。値は String 型です。名前は |
pt_col | pt_col1 から pt_col_n までの各パラメーターは、パーティションテーブルのパーティションレベルに対応します。各パラメーターは列参照である必要があります。 |
戻り値
struct<storagetier:string> 型の Struct 値を返します。この構造体には、対応するパーティションのストレージ階層を記述する単一の String フィールドが含まれています。
注意事項
テーブルに行レベルのルールを追加する際は、他のユーザーのアクセス動作を考慮してください。他のユーザーがテーブルにアクセスしたことがある場合は、予期しないアクセス拒否やデータフィルタリングの問題を防ぐために、明示的なルールを設定してください。詳細については、「行レベルのアクセス制御」をご参照ください。
デフォルトでは、MaxCompute テーブルは SQL だけでなく、Spark や Flink などのテーブルデータを読み取る外部エンジンからもアクセスできます。ただし、GET_PARTITION_META 関数は現在 MaxCompute SQL エンジンでのみサポートされています。したがって、行レベルのアクセス制御で GET_PARTITION_META 関数が使用されている場合、テーブルは MaxCompute SQL エンジンを介してのみ読み取ることができます。他のエンジンはテーブルにアクセスできません。
データにアクセスするには、行レベルの権限要件を満たすことに加えて、データへのアクセス権限、具体的にはデータに対する SELECT 権限が必要です。
GET_PARTITION_META のフィルター条件は、シナリオによって異なるパーティションプルーニング効果をもたらします。
フィルター条件がパーティションテーブルのパーティションフィールドのみを含む場合。例えば、標準ストレージ階層へのアクセスを許可し、第 1 レベルのパーティションの値が
2024であることを要求する場合。GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND pt1='2024'SQL を使用して
storage_tableにアクセスする際、WHERE 句にパーティション条件が含まれていない場合でも、システムはフルテーブルスキャンを防ぐためのパーティションプルーニングをサポートします。storage_table内で要件に一致するパーティションのみがアクセスされます。フィルター条件に非パーティションフィールドの値が含まれ、AND 演算子で 2 つのフィルター条件が接続されている場合。例えば、標準ストレージ階層へのアクセスを許可し、非パーティション値
a>100と AND 演算子を使用する場合。GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND a > 100SQL を使用して
storage_tableにアクセスする際、WHERE 句にパーティション条件が含まれていない場合でも、パーティションプルーニングはサポートされます。standard階層に保存されているパーティションのみがアクセスされます。フィルター条件に非パーティションフィールドの値が含まれ、OR 演算子で 2 つのフィルター条件が接続されている場合。例えば、標準ストレージ階層へのアクセスを許可し、非パーティション値
a>100と OR 演算子を使用する場合。get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard') OR a > 100SQL を使用して
storage_tableにアクセスする場合、2 つのシナリオが考えられます:WHERE 句にパーティション条件が含まれていない場合、
a>100条件に一致するデータをスキャンするためにすべてのパーティションがアクセスされます。WHERE 句にパーティション条件が含まれている場合、対応するパーティション内で
standardまたはa>100条件に一致するデータのみがスキャンされます。
使用例
パーティションテーブル storage_table を定義します。
CREATE TABLE storage_table(a BIGINT, b BIGINT) PARTITIONED BY (pt1 STRING, pt2 STRING);例 1:
デフォルトユーザーに
policy01権限を付与し、storage_tableの標準ストレージデータへのアクセスを許可します。プロジェクトオーナーを含むすべてのユーザーは、IA またはアーカイブストレージデータにアクセスできず、これらのリクエストに対しては NULL 値が返されます。CREATE ROW ACCESS POLICY policy01 ON storage_table TO DEFAULT FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard');Logview の Summary セクションに以下のキーワードが表示された場合、行レベルのフィルタリングがトリガーされます。

例 2:
ユーザー
user_xにpolicy02権限を付与し、storage_tableの IA およびアーカイブストレージデータへのアクセスを許可します。CREATE ROW ACCESS POLICY policy02 ON storage_table TO USER (user_x) --TO role rolename を使用してロールに権限を付与し、そのロールをユーザーに付与することもできます。 FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier IN ('lowfrequency','longterm'));2 つのシナリオが考えられます:
テーブルに既に
policy01権限がある場合、`user_x` を除くすべてのユーザーはstorage_tableの標準ストレージデータにアクセスできますが、IA またはアーカイブストレージデータにはアクセスできません。アクセスできないデータに対しては NULL 値が返されます。ユーザー `user_x` はstorage_tableの IA およびアーカイブストレージデータにアクセスできますが、標準ストレージデータにはアクセスできません。このアクセスできないデータに対しては NULL 値が返されます。テーブルに
policy01権限が設定されていない場合、`user_x` を除くすべてのユーザーはstorage_tableのどのストレージデータにもアクセスできず、NULL 値が返されます。`user_x` のみが IA およびアーカイブストレージデータへのアクセスを許可されますが、標準ストレージデータへのアクセスは拒否され、これも NULL 値が返されます。
例 3:
ユーザー
user_yにpolicy03権限を付与し、storage_tableのすべてのデータへのアクセスを許可します。CREATE ROW ACCESS POLICY policy03 ON storage_table TO USER (user_y) -- TO role rolename 句を使用してロールに権限を付与し、そのロールをユーザーに付与することもできます。 FILTER USING (true); -- 定数 true は、テーブル内のすべてのデータにアクセスできることを示します2 つのシナリオが考えられます:
テーブルに
policy01権限がある場合、`user_y` を除くすべてのユーザーはstorage_tableの標準ストレージデータにアクセスできます。IA またはアーカイブストレージデータにはアクセスできず、そのようなリクエストに対しては NULL 値が返されます。ユーザーuser_yはstorage_tableのすべてのストレージクラスのデータにアクセスできます。テーブルに
policy01権限がない場合、`user_y` を除くすべてのユーザーはstorage_tableのどのデータにもアクセスできず、NULL 値が返されます。ユーザーuser_yのみがstorage_tableのすべてのストレージクラスのデータにアクセスできます。