テーブルパーティショニングは、列の値に基づいて大規模なテーブルをより小さく、かつ独立して管理可能なセグメントに分割する手法です。ファクトテーブルや大規模なテーブルでは、パーティション単位で一括操作を行うことで、個々の行をスキャンする必要がなくなり、データ削除およびデータロードの処理速度を向上させます。
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'));この例における主なパラメーターは以下のとおりです。
| パラメーター | 値 | 説明 |
|---|---|---|
ORIENTATION | column | 分析クエリに最適化された、カラム指向ストレージ |
COMPRESSTYPE | zlib | ストレージ領域を削減するための zlib 圧縮 |
COMPRESSLEVEL | 5 | 圧縮レベル(1~9:数値が高いほど圧縮率は向上しますが、書き込み速度は低下します) |
BLOCKSIZE | 1048576 | ブロックサイズ(1 MB) |
DISTRIBUTED BY | l_orderkey | データをセグメント間で分散するためのディストリビューションキー |
PARTITION BY RANGE | L_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;