AnalyticDB for PostgreSQLは、行指向ストレージと列指向ストレージの2つのストレージモデルをサポートしています。 テーブルを作成するときは、使用シナリオに基づいて、行指向のストレージモデルを指定して行指向のテーブルを作成したり、列指向のストレージモデルを指定して列指向のテーブルを作成したりできます。 行指向テーブルは、INSERT文を使用して高い頻度で更新するか、リアルタイムで書き込む必要があるデータに使用されます。 列指向テーブルは、データクエリや少数の列の集計などのデータウェアハウジングのシナリオで使用されます。
行指向テーブル
デフォルトでは、AnalyticDB for PostgreSQLはPostgreSQLのヒープストレージモデルを使用して行指向のヒープテーブルを作成します。 行指向テーブルは、INSERT文を使用して高い頻度で更新するか、リアルタイムで書き込む必要があるデータに使用されます。 Bツリーインデックスを持つ行指向のテーブルは、ポイントクエリを実行するときに高いデータ取得パフォーマンスを提供します。
例:
次のステートメントは、行指向のヒープテーブルを作成します。
CREATE TABLE foo (a int, b text) DISTRIBUTED BY (a);
Data Transmission Service (DTS) を使用してAnalyticDB for PostgreSQLインスタンスにデータを書き込む場合、宛先テーブルは行指向のテーブルである必要があります。AnalyticDB for PostgreSQL DTSでは、ほぼリアルタイムでデータを同期できます。 DTSは、INSERTステートメントを使用して挿入されたデータに加えて、UPDATEやDELETEなどのSQLステートメントを使用して更新されたデータを同期できます。
列指向テーブル
列指向テーブル内のデータは、列ごとに格納されます。 データにアクセスすると、関連する列のみが読み取られます。 列指向テーブルは、データクエリや少数の列の集計などのデータウェアハウジングのシナリオで使用されます。 これらのシナリオでは、列指向テーブルが効率的なI/Oを提供します。 ただし、列指向テーブルは、データが頻繁に挿入または更新されるシナリオでは効率が低くなります。 列指向テーブルにデータを挿入するには、COPYなどのバッチ読み込み方法を使用することを推奨します。 列指向テーブルは、行指向テーブルによって提供されるデータ圧縮率よりも3〜5倍高いデータ圧縮率を提供します。
例:
列指向テーブルは、アペンド最適化テーブルである必要があります。 つまり、作成する列指向テーブルのappendonlyパラメーターをtrueに設定する必要があります。
CREATE TABLE bar (a int, b text)
WITH (appendonly=true, orientation=column)
DISTRIBUTED BY (a);
データ圧縮
データ圧縮は、列指向テーブル、またはappendonlyパラメーターがtrueに設定されている追加最適化された行指向テーブルに使用されます。 2つの圧縮タイプがあります。
テーブルレベルの圧縮。
列レベルの圧縮。 各列に固有の圧縮アルゴリズムを使用できます。
AnalyticDB for PostgreSQLは、次の圧縮アルゴリズムをサポートしています。
AnalyticDB for PostgreSQL V4.3はzlibとRLE_TYPEをサポートしています。
AnalyticDB for PostgreSQL V6.0は、Zstandard (zstd) 、zlib、RLE_TYPE、およびlz4をサポートしています。
AnalyticDB for PostgreSQL V6.0は、Zstandard (zstd) 、zlib、RLE_TYPE、およびlz4をサポートしています。
QuickLZ圧縮アルゴリズムを指定すると、代わりにzlibが使用されます。 RLE_TYPEは、列指向のテーブルにのみ使用されます。
例:
圧縮レベル5のzlib圧縮アルゴリズムを使用する列指向テーブルを作成します。
CREATE TABLE foo (a int, b text)
WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5);
圧縮レベル9のzstd圧縮アルゴリズムを使用する列指向テーブルを作成します。
CREATE TABLE foo (a int, b text)
WITH (appendonly=true, orientation=column, compresstype=zstd, compresslevel=9);