AnalyticDB for PostgreSQLは、行ストアと列ストアの2つのストレージモデルをサポートしています。 テーブルを作成するときは、行ストアモデルを指定して行指向テーブルを作成したり、列ストアモデルを指定して列指向テーブルを作成したりできます。
行指向テーブル
デフォルトでは、行指向のテーブルはAnalyticDB for PostgreSQLに作成されます。 行指向のテーブルは、PostgreSQLのヒープテーブルと同じストレージアーキテクチャを使用します。 行指向テーブルは、1つまたは複数の行のデータが頻繁に挿入されてから変更または削除されるオンライントランザクション処理 (OLTP) シナリオでパフォーマンスが向上します。 ディメンションテーブルなどの小さなテーブルが必要な場合は、行指向のテーブルを使用することを推奨します。 Bツリーインデックスが使用される場合、行指向のテーブルは、より良いポイントルックアップクエリ性能を提供することができる。
Data Transmission Service (DTS) を使用してAnalyticDB for PostgreSQLにデータをインポートする場合、宛先テーブルとして行指向のテーブルを作成することを推奨します。 DTSは、ほぼリアルタイムでデータ同期を可能にします。 挿入されたデータに加えて、DTSはUPDATEやDELETEなどのSQL文を使用して更新されたデータを同期できます。
次のステートメントを実行して、fooという名前の行指向ヒープテーブルを作成します。
CREATE TABLE foo (a int, b text)
DISTRIBUTED BY (a);
列指向テーブル
列指向テーブル内のデータは、列ごとに格納されます。 データにアクセスすると、関連する列のみが読み取られます。 列指向テーブルは、データクエリや少数の列の集計などのデータウェアハウジングシナリオで効率的なI/O操作を提供できます。 ただし、列指向テーブルは、データが頻繁に挿入または更新されるシナリオでは効率が低くなります。 列指向テーブルにデータを挿入するには、COPYなどのバッチ読み込み方法を使用することを推奨します。 列指向テーブルは、行指向テーブルによって提供されるデータ圧縮率よりも最大5倍高いデータ圧縮率を提供できます。
列指向テーブルは、追加最適化 (AO) テーブルである必要があります。 列指向テーブルを作成するときは、appendonlyをtrueに設定する必要があります。
次のステートメントを実行して、barという名前の列指向テーブルを作成します。
CREATE TABLE bar (a int, b text)
WITH (appendonly=true, orientation=column)
DISTRIBUTED BY (a);
テーブルのストレージモデルを選択する
ストレージモデルの選択は、データワークロードに基づいて決定されます。 ストレージモデルを選択するときは、次の項目に注意してください。
ほとんどの汎用または混合ワークロードでは、行指向のテーブルは柔軟性とパフォーマンスを向上させることができます。
1つまたは複数の行のデータを頻繁に挿入、変更、または削除する必要がある場合は、行指向のテーブルを選択することを推奨します。
ほとんど変更または削除されない大量のデータをインポートする必要がある場合は、行指向のテーブルを選択することを推奨します。
すべてまたはほとんどの列に対して射影クエリまたは条件文を実行する必要がある場合、または行サイズが小さい場合は、行指向のテーブルを選択することを推奨します。 多くの列のサブセットが頻繁に照会される場合は、列指向テーブルを選択することを推奨します。
列指向のテーブルは各列で同じデータ型を使用するため、類似のデータと隣接するデータの圧縮が容易になります。 したがって、列指向のテーブルは、行指向のテーブルよりも少ないストレージを占有します。 しかし、より簡単な圧縮は、より困難なランダムクエリをもたらす。
テーブルのストレージモデルの変更
ストレージモデルは、テーブルの作成時にのみ指定できます。 テーブルのストレージモデルを変更するには、目的のストレージモデルを使用して別のテーブルを作成し、元のテーブルから新しいテーブルにデータをインポートする必要があります。 次に、元のテーブルを削除し、新しいテーブルの名前を元のテーブルの名前に変更できます。 また、元のテーブルの権限を新しいテーブルに割り当てる必要があります。 このプロセスはアトミックではありません。 データの整合性を確保するには、このプロセス中に元のテーブルを読み取り専用に設定する必要があります。
次のステートメントを実行して、fooテーブルのストレージモデルを行ストアから列ストアに変更します。
CREATE TABLE foo_tmp (LIKE foo) WITH (appendonly=true, orientation=column);
INSERT INTO foo_tmp SELECT * FROM sales;
DROP TABLE foo;
ALTER TABLE foo_tmp RENAME TO foo;
GRANT ALL PRIVILEGES ON foo TO user1;
GRANT SELECT ON foo TO user2;