背景
Greenplumデータベースは行指向および列指向のストレージモデルをサポートしており、さらにヒープテーブルと追記最適化(AO)テーブルを提供します。これらのストレージオプションの違いと選択基準、ならびに圧縮機能、データ分散戦略の変更方法について解説します。
ヒープテーブルとAOテーブル
基本原理
ヒープテーブル
ヒープテーブルはPostgreSQLのストレージモデルを継承しており、すべての変更がREDOログを生成し、ポイントインタイムリカバリを実現します。ただし、論理的な増分バックアップには対応していません。OLTPワークロードにおいて頻繁なデータ変更が行われる場合に適しており、初期ロード後に更新が頻繁に行われる次元テーブルなどの小規模テーブルに最適です。
AOテーブル
追記最適化テーブルはデータウェアハウス環境での大規模な非正規化テーブルに適しています。削除や更新操作は別個のビットマップファイルでマークされ、バッチデータロードに最適化されています。単一行のINSERTには向かず、高い圧縮率と論理的な増分バックアップをサポートします。
選択基準
ヒープテーブルは小規模トランザクションが多く、ポイントインタイムリカバリが必要な場合に選択します。AOテーブルは列指向ストレージが必要な場合やバッチデータ投入時に適しています。
作成例
-- ヒープテーブルの作成
CREATE TABLE sample_heap (id integer, data varchar) DISTRIBUTED BY (id);
-- AOテーブルの作成
CREATE TABLE sample_ao (id integer, data varchar)
WITH (appendoptimized = true)
DISTRIBUTED BY (id);
行指向と列指向ストレージ
基本原理
行指向ストレージ
行単位でデータを格納し、複数列へのアクセスが効率的です。ただし、後方の列へのアクセスにはデフォーム処理が必要であり、圧縮率も低めです。
列指向ストレージ
列単位でデータを格納し、高い圧縮率とベクトル化処理に適しています。ただし、複数列の参照には複数ファイルへのアクセスが必要です。
選択基準
行指向はOLTPワークロードや詳細データ参照が多い場合に、列指向はOLAPワークロードや集計処理が多い場合に適しています。
作成例
-- 列指向テーブルの作成
CREATE TABLE sample_column (id integer, data varchar)
WITH (appendoptimized = true, orientation = column)
DISTRIBUTED BY (id);
圧縮機能
AOテーブルに対してテーブルレベルおよび列レベルの圧縮を適用できます。使用可能なアルゴリズムにはZLIB、ZSTD、QUICKLZ、RLE_TYPEなどがあります。
圧縮テーブルの作成
CREATE TABLE compressed_table (id integer, data varchar)
WITH (appendoptimized = true, compresstype = zlib, compresslevel = 5);
圧縮設定の確認
-- 圧縮率の確認
SELECT get_ao_compression_ratio('compressed_table');
-- データ分散の確認
SELECT get_ao_distribution('compressed_table');
パフォーマンス比較
行指向と列指向のストレージでは、データアクセスパターンによって性能特性が異なります。前方の列へのアクセスは行指向が有利ですが、特定列の集計処理では列指向が優位になります。
ストレージ構造の確認
-- テーブルストレージタイプの確認
SELECT nspname, relname, relstorage
FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE relkind = 'r';
-- AOテーブルの一覧
SELECT nspname, relname
FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE relstorage IN ('a', 'c');
分散戦略の変更
-- 分散キーの変更
ALTER TABLE sales SET DISTRIBUTED BY (customer_id);
-- データの再分散
ALTER TABLE sales SET WITH (REORGANIZE = true);
ストレージモデルの変更
ストレージモデルを変更するには、新しいストレージ設定でテーブルを作成し、データを移行する必要があります。
圧縮列の追加
ALTER TABLE existing_table
ADD COLUMN new_column integer DEFAULT 0
ENCODING (compresstype = zlib);
圧縮設定の継承
パーティションテーブルでは、サブパーティションの圧縮設定が新しいパーティションに継承されます。