すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:パーティションテーブルの概要

最終更新日:Sep 16, 2025

パーティションテーブルとは、1 つ以上の列に基づいてデータが分割され、異なる物理的な場所に格納されるテーブルです。効果的なパーティション化は、クエリを高速化し、データ管理を簡素化し、より柔軟なデータ操作を可能にします。

パーティション化 オプション

MaxCompute は、パーティションを管理するための 2 つの方法を提供しています。

  • 標準パーティションテーブル: テーブルのデータをセグメント化するために、1 つ以上の列をパーティションキーとして定義します。

  • 自動パーティションテーブル: パーティション列は、次の 2 つの方法に基づいて自動的に生成されます。

    自動パーティション方式

    説明

    時間計算関数に基づく自動パーティションテーブル

    MaxCompute は、時間ベースの列 ( DATE 、 DATETIME 、 TIMESTAMP など) に TRUNC_TIME 関数を適用し、計算結果をパーティション値として使用することにより、テーブルを自動的にパーティション化します。

    データ書き込み時間に基づく自動パーティションテーブル

    MaxCompute は、データの取り込み時間 (システムに書き込まれた時間) に TRUNC_TIME 関数を適用することにより、テーブルを自動的にパーティション化します。この方法は、取り込み時間パーティション化と呼ばれます。

パーティションテーブルを使用する場合

次のシナリオでは、テーブルのパーティション化を検討してください。

  • クエリを高速化する: パーティションテーブルを使用すると、クエリはテーブル全体ではなく必要なパーティションのみをスキャンするため、処理されるデータ量が削減されます。

  • コストを削減する: クエリでパーティションフィルターを指定すると、全表スキャンに関連するリソースの無駄が回避され、計算コストが効果的に削減されます。

  • パーティションレベルでデータを管理する: 全表スキャンを実行せずに、特定のパーティションにデータを書き込んだり、特定のパーティションからデータを削除したりできます。これにより、効率的なデータ管理が可能になり、ライフサイクルポリシーを使用してパーティションレベルでデータを自動的にクリーンアップできます。

説明

最適なパフォーマンスを得るには、各パーティションに少なくとも 10,000 行が含まれていることを確認してください。過剰な数の small パーティションは、クエリのパフォーマンスを低下させる可能性があります。

制限

  • テーブルには最大 6 つのパーティションレベルを設定できます。

  • テーブルには最大 60,000 個のパーティションを設定できます。

  • 1 つのクエリで最大 10,000 個のパーティションをクエリできます。

  • STRING 型のパーティションキー列の値には、漢字を含めることはできません。

パーティション列のデータ型

  • MaxCompute V2.0 では、パーティション列は STRING 、 TINYINT 、 SMALLINT 、 INT 、 BIGINT 、および VARCHAR 型をサポートしています。

    MaxCompute はパーティション値を STRING として格納し、他の型は自動的に変換されます。潜在的なエラーを回避するには、パーティション列を STRING として定義します。

  • MaxCompute 1.0 データ型バージョンでは、パーティション列は STRING 型のみをサポートしています。

    パーティション列の型を BIGINT として定義できますが、これはテーブルスキーマでの型の表示方法にのみ影響します。計算や比較などのすべての計算操作では、MaxCompute は列を STRING として扱います。次の例では、返される結果は Empty です。

    ---parttest という名前のテーブルを作成します。
    CREATE TABLE parttest (a BIGINT) PARTITIONED BY (pt BIGINT);
    
    ---テーブルにデータを挿入します。
    INSERT INTO parttest PARTITION(pt)(a,pt) VALUES (1, 1);
    INSERT INTO parttest PARTITION(pt)(a,pt) VALUES (1, 10);
    
    ---pt の値が 2 以上である行をクエリします。
    SELECT * FROM parttest WHERE pt >= '2';
  • MaxCompute は、時間/日付型のデータをパーティション列として使用することをサポートしていませんが、自動パーティション機能を使用して、テーブル内の時間/日付型のデータに対する関数計算に基づいてパーティションを生成できます。詳細については、「自動パーティションテーブルの例」をご参照ください。

標準パーティションテーブルの例

  1. パーティションテーブルを作成します。

    -- 日付を第 1 レベルのパーティション、地域を第 2 レベルのパーティションとする、標準の 2 レベルのパーティションテーブルを作成します。
    CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING,region STRING);
  2. パーティションを追加し、 INSERT INTO コマンドを実行して、パーティションテーブル src にデータを追加します。

    ALTER TABLE src ADD PARTITION (pt='20170506',region='hangzhou') PARTITION (pt='20180101',region='shanghai');
    INSERT INTO src PARTITION (pt='20170506',region='hangzhou') VALUES ('s1',1),('s2',2),('s3',3);
    INSERT INTO src PARTITION (pt='20180101',region='shanghai') VALUES ('c1',4),('c2',5),('c3',6);
  3. パーティションをフィルター条件として使用して、テーブルをクエリします。

    • 正しい例: クエリで pt='20170506'region='hangzhou' が指定されている場合、MaxCompute は対応する第 1 レベルと第 2 レベルのパーティションを正確に特定し、一致するデータのみを処理して、全表スキャンを回避します。

      SELECT * FROM src WHERE pt='20170506' AND region='hangzhou'; 

      出力:

      +------------+-------------+------------+------------+
      | shop_name  | customer_id | pt         | region     |
      +------------+-------------+------------+------------+
      | s1         | 1           | 20170506   | hangzhou   |
      | s2         | 2           | 20170506   | hangzhou   |
      | s3         | 3           | 20170506   | hangzhou   |
      +------------+-------------+------------+------------+
    • 正しくない例: この方法では、パーティションプルーニングが正しく機能するとは限りません。pt フィールドは STRING 型ですが、 BIGINT 値 (例: 20170506 ) と比較すると、MaxCompute は両方のオペランドを暗黙的に DOUBLE にキャストするため、精度が失われ、パーティションプルーニングの最適化が損なわれる可能性があります。

      SELECT * FROM src WHERE pt = 20170506 AND region = hangzhou; 

自動パーティションテーブルの例