テーブルがパーティション分割されている場合、システムは、テーブル全体をスキャンするのではなく、指定されたクエリ条件を満たすパーティションのみをスキャンします。 これにより、クエリのパフォーマンスが向上します。
パーティション分割テーブルの使用
AnalyticDB for PostgreSQLは、範囲、リスト、およびマルチレベルのパーティションテーブルをサポートしています。 次の図は、日付ベースの範囲パーティションとリージョンベースのリストパーティションを持つマルチレベルパーティション分割テーブルを示しています。

適用シナリオ
テーブルを分割するかどうかを決めるときは、次の項目に注意してください。
データボリューム: 10万のデータ行を持つファクトテーブルなど、大量のデータを含むテーブルでパーティションを使用することを推奨します。 標準は、エクスペリエンスとクエリのパフォーマンスによって異なります。
パーティション列: テーブルに大量のデータがあり、日や月などの適切なパーティション列がある場合は、パーティション分割を使用できます。
データライフサイクル: ほとんどの場合、データはデータライフサイクルに基づいてデータウェアハウスで管理する必要があります。 パーティションテーブルを使用すると、古いデータの削除などのデータ管理を容易にできます。
クエリ文: テーブルがパーティション分割されている場合、クエリのパフォーマンスは、クエリ文にパーティション列が含まれている場合にのみ向上します。 パーティション列を含まないクエリ文をパーティションテーブルで実行すると、すべてのパーティションがスキャンされるため、クエリが完了するまでに時間がかかる場合があります。
レンジパーティションテーブルの作成
AnalyticDB for PostgreSQLを使用して、START値、END値、およびパーティション増分値を定義するEVERY句を指定することで、パーティションを生成できます。 デフォルトでは、START値は包括的で、END値は排他的です。 例:
CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( START (date '2016-01-01') INCLUSIVE
END (date '2017-01-01') EXCLUSIVE
EVERY (INTERVAL '1 day') );数値データ型の列をパーティションキーとして使用するレンジパーティションテーブルを作成することもできます。 例:
CREATE TABLE rank (id int, rank int, year int, gender char(1), count int)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
( START (2006) END (2016) EVERY (1),
DEFAULT PARTITION extra ); リストパーティションテーブルの作成
リストパーティション分割テーブルは、同等性の比較を可能にする任意のデータ型の列をパーティションキーとして使用できます。 リストパーティションの場合は、作成する各パーティション (リスト値) のパーティション仕様を宣言する必要があります。 例:
CREATE TABLE rank (id int, rank int, year int, gender
char(1), count int )
DISTRIBUTED BY (id)
PARTITION BY LIST (gender)
( PARTITION girls VALUES ('F'),
PARTITION boys VALUES ('M'),
DEFAULT PARTITION other );マルチレベルパーティションテーブルの作成
マルチレベルのパーティションを持つテーブルを作成できます。 次のサンプルステートメントは、3レベルのパーティショニングテーブルを作成する方法を示しています。 範囲パーティション内のデータは月ごとに分割され、リストパーティション内のデータは地域ごとに分割されます。
CREATE TABLE sales
(id int, year int, month int, day int, region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (month)
SUBPARTITION BY LIST (region)
SUBPARTITION TEMPLATE (
SUBPARTITION usa VALUES ('usa'),
SUBPARTITION europe VALUES ('europe'),
SUBPARTITION asia VALUES ('asia'),
DEFAULT SUBPARTITION other_regions)
(START (1) END (13) EVERY (1),
DEFAULT PARTITION other_months );パーティション分割テーブルクエリの最適化
パーティションの粒度
時間で区切られたテーブルの場合、粒度は日、週、または月になります。 より細かい粒度は、各パーティションにおいてより少ない量のデータを生成するが、より多くのパーティションを生成する。 パーティションの数は絶対標準では測定されません。 通常、パーティションの数は約200と非常に多いと見なされます。 多数のパーティションは、データベースのパフォーマンスに大きな影響を与えます。 たとえば、クエリオプティマイザが実行計画を生成するのに時間がかかる場合があり、VACUUMなどのメンテナンス操作が遅くなる場合があります。
マルチレベル分割テーブルでは、分割ファイルの数が急激に増加することがある。 たとえば、24か月と100の都市を含むシナリオで、テーブルが月と都市で分割されている場合、テーブルパーティションの総数は2,400になります。 テーブルが物理テーブルの各列を格納する列指向のテーブルであり、テーブルに100の列が含まれている場合、システムはテーブルに対して100,000を超えるファイルを管理する必要があります。 パーティション分割方法を決定するときは、必要なパーティションの数を見積もる必要があります。
パーティションの剪定
AnalyticDB for PostgreSQLは、パーティションテーブルのパーティションプルーニングをサポートしています。 詳細については、「パーティションプルーニング」をご参照ください。
パーティション分割テーブルの維持
パーティションテーブルでは、さまざまなSQL文を使用してパーティションを管理できます。 例:
パーティションの作成
デフォルトのパーティションが存在する場合、パーティションを作成できません。 ただし、デフォルトのパーティションは分割できます。
ALTER TABLE test_partition_range ADD partition p2 start ('2017-02-01') end ('2017-02-28');パーティションとそのサブパーティションを削除する
ALTER TABLE test_partition_range DROP partition p2;パーティションの名前変更
ALTER TABLE test_partition_range RENAME PARTITION p2 TO Feb17;パーティションをクリアする
ALTER TABLE test_range_partition TRUNCATE PARTITION p1;パーティションの交換
ALTER TABLE test_range_partition EXCHANGE PARTITION p2 WITH TABLE {cos_table_name} ;パーティションを分割する
-- Split the p2 partition into two partitions with the boundary value set to 2017-02-20. ALTER TABLE test_partition_range SPLIT partition p2 at ('2017-02-20') into (partition p2, partition p3);