パーティションテーブルとは、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 レベルのパーティション、地域を第 2 レベルのパーティションとする、標準の 2 レベルのパーティションテーブルを作成します。 CREATE TABLE src (shop_name STRING, customer_id BIGINT) PARTITIONED BY (pt STRING,region STRING);パーティションを追加し、 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);パーティションをフィルター条件として使用して、テーブルをクエリします。
正しい例: クエリで
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;