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

AnalyticDB:テーブルパーティションの使用方法

最終更新日:Mar 28, 2026

テーブルパーティショニングは、列の値に基づいて大規模なテーブルをより小さく、かつ独立して管理可能なセグメントに分割する手法です。ファクトテーブルや大規模なテーブルでは、パーティション単位で一括操作を行うことで、個々の行をスキャンする必要がなくなり、データ削除およびデータロードの処理速度を向上させます。

  • ALTER TABLE DROP PARTITION を使用してパーティション内の全データを削除します — 行単位での削除と比較して、はるかに高速です。

  • ALTER TABLE EXCHANGE PARTITION を用いたパーティション交換により、新規バッチデータをロードします。これにより、フルテーブル書き込みをバイパスできます。

テーブルパーティショニングの適用タイミング

テーブルのパーティショニングを実施する前に、以下の条件を確認してください。

  • テーブルが大規模である。 数百万行または数十億行のテーブルは、パーティショニングの対象として適しています。一方、数千行程度の小規模テーブルでは、管理オーバーヘッドがパフォーマンス向上効果を上回ることが一般的です。

  • クエリが特定の列でフィルター処理される。 WHERE 句で常にパーティションキーを参照している場合、クエリプランナーが関係のないパーティションをスキップできるため、パーティショニングの効果が高まります。

  • データを時間またはカテゴリ単位で管理する。 前月分のデータを定期的に削除したり、日次バッチデータをロードしたりするような運用は、自然にパーティション境界に対応します。

ほとんどのクエリがパーティションキーによるフィルターなしでフルテーブルスキャンを実行する場合、パーティショニングはパフォーマンス向上をもたらさず、むしろオーバーヘッドを増加させます。

パーティションの種類

AnalyticDB for PostgreSQL では、以下の 3 種類のパーティションがサポートされています。

種類適用タイミング
レンジパーティション数値または日付/時刻の連続範囲に基づくパーティション分割 — たとえば、時系列データに対して月単位でパーティションを作成します。
リストパーティション明示的な離散値のリストに基づくパーティション分割 — たとえば、営業エリアまたは製品カテゴリごとにパーティションを作成します。
コンポジット・パーティションレンジおよびリスト戦略を組み合わせた、多次元データ向けのパーティション分割 — たとえば、まず年単位でパーティションを分割し、さらに各年ごとにリージョン単位で細分化します。
レンジパーティションは、数値型および日付/時刻型の列のみをサポートします。

パーティションテーブルの作成

以下の例では、出荷日 (L_SHIPDATE) をパーティションキーとして LINEITEM テーブルを作成します。各パーティションは、1992 年 1 月から 2000 年 1 月までの暦月単位で構成されます。

CREATE TABLE LINEITEM (
    L_ORDERKEY      BIGINT NOT NULL,
    L_PARTKEY       BIGINT NOT NULL,
    L_SUPPKEY       BIGINT NOT NULL,
    L_LINENUMBER    INTEGER,
    L_QUANTITY      FLOAT8,
    L_EXTENDEDPRICE FLOAT8,
    L_DISCOUNT      FLOAT8,
    L_TAX           FLOAT8,
    L_RETURNFLAG    CHAR(1),
    L_LINESTATUS    CHAR(1),
    L_SHIPDATE      DATE,
    L_COMMITDATE    DATE,
    L_RECEIPTDATE   DATE,
    L_SHIPINSTRUCT  CHAR(25),
    L_SHIPMODE      CHAR(10),
    L_COMMENT       VARCHAR(44)
) WITH (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576, OIDS=false)
DISTRIBUTED BY (l_orderkey)
PARTITION BY RANGE (L_SHIPDATE)
    (START (date '1992-01-01') INCLUSIVE END (date '2000-01-01') EXCLUSIVE EVERY (INTERVAL '1 month'));

この例における主なパラメーターは以下のとおりです。

パラメーター説明
ORIENTATIONcolumn分析クエリに最適化された、カラム指向ストレージ
COMPRESSTYPEzlibストレージ領域を削減するための zlib 圧縮
COMPRESSLEVEL5圧縮レベル(1~9:数値が高いほど圧縮率は向上しますが、書き込み速度は低下します)
BLOCKSIZE1048576ブロックサイズ(1 MB)
DISTRIBUTED BYl_orderkeyデータをセグメント間で分散するためのディストリビューションキー
PARTITION BY RANGEL_SHIPDATEパーティション列 — 数値型または日付/時刻型である必要があります

パーティションの管理

古いパーティションの削除

パーティション内の全データを削除するには、パーティションを直接削除します。これは、個々の行をスキャンせずにパーティションのストレージを削除するため、DELETE 文よりもはるかに高速です。

ALTER TABLE LINEITEM DROP PARTITION FOR (date '1992-01-01');

パーティション交換によるデータロード

ALTER TABLE EXCHANGE PARTITION コマンドを使用して、新規データパーティションを追加します。これにより、フルテーブル書き込みを実行することなく、パーティションテーブルへバッチデータをロードできます。

ALTER TABLE LINEITEM EXCHANGE PARTITION FOR (date '1999-12-01')
    WITH TABLE lineitem_staging;