GreenplumにおけるHeapテーブルとAOテーブルの基本概念と実装

基本概念

Heapテーブル

PostgreSQLのネイティブストレージ形式で、データ行は挿入順にページに格納されます。更新/削除操作は元の位置にマーキングされ、MVCCによる旧バージョンはその場に残り、VACUUM処理で後回収されます。

AOテーブル(Append-Optimized)

Greenplum固有の追記専用フォーマットで、更新時に元行を削除マークし、新行をファイル末尾に追記します。ストレージタイプは二種類存在します:

  • orientation=row: 行指向AOテーブル
  • orientation=column: 列指向AOCOテーブル

削除領域はバックグラウンドVACUUMで圧縮・回収されます。

特性比較表

特性HeapAO行指向AOCO列指向
ストレージ方式ヒープページ行ブロック追記列ブロック追記
更新/削除性能高速中速中速
単一行挿入高速低速最低
一括ロード中速最速最速
圧縮率不可3-8倍5-15倍
インデックス種別全対応B-tree/BitmapB-tree/Bitmap
適用シナリオ高頻度更新バッチ追記列指向分析

設計指針

  • 高頻度更新テーブル・小規模参照用 → Heap
  • 大規模追記・行単位ETL処理 → AO行指向
  • 大規模分析・ストレージ最適化 → AOCO列指向

操作実装

ストレージタイプ確認クエリ

SELECT 
   ns.nspname AS schema,
   cl.relname AS table,
   CASE cl.relstorage
      WHEN 'h' THEN 'heap'
      WHEN 'a' THEN 'ao'
      WHEN 'c' THEN 'aoco'
   END AS type,
   pg_size_pretty(pg_relation_size(cl.oid)) AS size
FROM pg_class cl
JOIN pg_namespace ns ON ns.oid = cl.relnamespace
WHERE cl.relkind = 'r' 
  AND ns.nspname NOT LIKE 'pg_%';

テーブル作成例

Heapテーブル(デフォルト)

CREATE TABLE user_accounts (
    account_id SERIAL PRIMARY KEY,
    user_name VARCHAR(50)
) DISTRIBUTED BY (account_id);

AO行ストレージ(圧縮付き)

CREATE TABLE event_logs (
    log_id BIGINT,
    log_data TEXT,
    created_at TIMESTAMP
) WITH (
    appendonly = true,
    orientation = row,
    compresstype = zstd,
    compresslevel = 5
);

AOCO列ストレージ(パーティション分割)

CREATE TABLE sensor_readings (
    device_id INTEGER,
    reading_time TIMESTAMP,
    temperature FLOAT4,
    humidity FLOAT4
) WITH (
    appendonly = true,
    orientation = column,
    compresstype = zstd,
    compresslevel = 7
)
PARTITION BY RANGE (reading_time)
(START ('2024-01-01') END ('2025-01-01')
 EVERY (INTERVAL '1 week'));

タグ: Greenplum HEAPテーブル AOテーブル データベース設計 ストレージフォーマット

7月25日 03:13 投稿