Greenplumにおけるテーブルストレージモデルの選択と実装

背景

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);

圧縮設定の継承

パーティションテーブルでは、サブパーティションの圧縮設定が新しいパーティションに継承されます。

タグ: Greenplum データベース ストレージモデル 列指向 行指向

7月27日 00:53 投稿