基本概念
Heapテーブル
PostgreSQLのネイティブストレージ形式で、データ行は挿入順にページに格納されます。更新/削除操作は元の位置にマーキングされ、MVCCによる旧バージョンはその場に残り、VACUUM処理で後回収されます。
AOテーブル(Append-Optimized)
Greenplum固有の追記専用フォーマットで、更新時に元行を削除マークし、新行をファイル末尾に追記します。ストレージタイプは二種類存在します:
- orientation=row: 行指向AOテーブル
- orientation=column: 列指向AOCOテーブル
削除領域はバックグラウンドVACUUMで圧縮・回収されます。
特性比較表
| 特性 | Heap | AO行指向 | AOCO列指向 |
|---|---|---|---|
| ストレージ方式 | ヒープページ | 行ブロック追記 | 列ブロック追記 |
| 更新/削除性能 | 高速 | 中速 | 中速 |
| 単一行挿入 | 高速 | 低速 | 最低 |
| 一括ロード | 中速 | 最速 | 最速 |
| 圧縮率 | 不可 | 3-8倍 | 5-15倍 |
| インデックス種別 | 全対応 | B-tree/Bitmap | B-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'));