インスタンスタイプを変更せずに、ストレージ使用量を削減し、ApsaraDB RDS for PostgreSQLインスタンスの読み取りパフォーマンスを向上させたい場合は、透過ページ圧縮 (TPC) 機能を使用できます。 この機能は、バッファプール内のページデータをリアルタイムで圧縮および解凍します。 これにより、ストレージコストが効果的に削減され、I/Oスループットが向上します。 しかしながら、この特徴はCPU性能を低下させる。
前提条件
RDSインスタンスはPostgreSQL 14以降を実行します。 それでもTPC機能がサポートされていない場合は、RDSインスタンスのマイナーエンジンバージョンを更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
機能の説明
TPC機能は、バッファプール内のページデータをリアルタイムで圧縮および解凍します。 データは、データがディスクに書き込まれるときに自動的に圧縮され、データがディスクから読み出されるときに解凍される。 圧縮および解凍プロセスは、ユーザには知覚できない。
TPC機能は、ストレージ使用量を減らし、RDSインスタンスの読み取りパフォーマンスを向上させるために開発されています。 この機能により、ディスクI/Oとストレージの使用量が削減され、キャッシュの効率が向上し、データを圧縮することでデータ転送が高速化されます。
シナリオ
CPU使用率が50% 未満です。 IOPSまたはI/Oスループットがボトルネックになることがよくあります。
メリット
ストレージコストは平均して約50% 削減されます。
I/O使用量は平均で約50% 削減されます。
読み取りシナリオでは、1秒あたりのトランザクション (TPS) が増加します。 I/Oスルーが上限に達するいくつかの読み取りシナリオでは、TPSは最大100% 増加します。
影響
この機能により、RDSインスタンスのCPU使用率が向上します。 データ圧縮に使用されるCPUリソースは約260% 増加し、データ解凍に使用されるCPUリソースは約40% 増加します。
書き込みシナリオでは、TPSが減少します。
RDSインスタンスに対して透過データ暗号化 (TDE) 機能も有効になっている場合、TPC機能の圧縮結果が影響を受けます。
TPC機能は、TOASTデータに対して不十分に機能します。
手順
機能はテーブルスペースに依存するため、TPC機能を使用するために圧縮用のテーブルスペースを作成します。
CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');
重要この手順で作成されるテーブルスペースの名前、パス、および圧縮アルゴリズムは変更しないでください。
圧縮用のテーブルまたはインデックスを作成します。
テーブルとインデックスを作成または変更するときは、TPC機能を使用するために圧縮するテーブルスペースを指定します。
テーブル圧縮
-- テーブルを作成するときは、TPC機能を使用するために圧縮するテーブルスペースを指定します。 CREATE TABLE <tablename> ... TABLESPACE rds_compress; -テーブルを変更するときは、テーブルのテーブルスペースを圧縮用のテーブルスペースに変更します。 ALTER TABLE <tablename> SET TABLESPACE rds_compress;
インデックス圧縮
-- インデックスを作成するときは、TPC機能を使用するために圧縮用のテーブルスペースを指定します。 CREATE INDEX <indexname> ... TABLESPACE rds_compress; -インデックスを変更するときは、インデックスのテーブルスペースを圧縮用のテーブルスペースに変更します。 ALTER INDEX <indexname> SET TABLESPACE rds_compress;
デフォルトのテーブルスペースを圧縮用のテーブルスペースに変更します。 このように、TPC機能はデフォルトで新しいテーブルとインデックスに使用されます。
-- デフォルトのテーブルスペースを圧縮用のテーブルスペースに設定します。 default_tablespaceを 'rds_compress' に設定します。-テーブルまたはインデックスを作成するときは、テーブルスペースを指定する必要はありません。 デフォルトでは、TPC機能が使用されます。 CREATE TABLE <tablename> ...; CREATE INDEX <indexname> ...;
関連クエリ
テーブルまたはインデックスが圧縮用のテーブルスペースに作成されているかどうかを確認します。
psqlコマンドラインで、
\d + <テーブル名>
を入力して、テーブルの詳細を照会します。テーブルとインデックスが圧縮用のテーブルスペースに作成されている場合は、TPC機能を使用できます。 次の出力は、sysbenchテーブルのスキーマを示しています。
テーブル "public.sbtest1" 列 | タイプ | 照合順序 | Nullable | デフォルト | ストレージ | 圧縮 | 統計ターゲット | 説明 -------- ---------------- ------------------- ------------------------------------- --------------------------------------------------------------------- id | integer | | not null | nextval('sbtest1_id_seq '::regclass) | plain | | | k | integer | | nullではない | 0 | plain | | c | 文字 (120) | | nullではない | ''::bpchar | 拡張 | | | pad | character(60) | | nullではない | ''::bpchar | 拡張 | | | インデックス: "sbtest1_pkey" PRIMARY KEY、btree (id) 、テーブルスペース "rds_compress" "k_1" btree (k) 、テーブルスペース "rds_compress" テーブルスペース: "rds_compress" アクセス方法: ヒープ
データが圧縮されているかどうかを確認します。
pg_database_size
、pg_tablespace_size
、pg_relation_size
、pg_table_size
、pg_index_size
、pg_total_relation_size
などの関数を使用して、データのサイズをリアルタイムで表示できます。説明sysbenchを使用して、同じ量のテストデータを圧縮テーブルと非圧縮テーブルに別々に挿入し、テーブルのディスク使用状況を確認できます。 圧縮テーブルのディスク使用量は、非圧縮テーブルのディスク使用量の約50% です。
テーブルの圧縮率を計算します。
SELECT pg_relation_size('<tablename>')::float / (relpages * 8192) from pg_class WHERE relname = '<tablename>';
説明上記のステートメントでは、
pg_relation_size('<tablename>')
関数を呼び出して、pg_class
システムディレクトリからテーブルのディスク使用量をバイト単位で照会し、取得した値を浮動小数点数に変換します。 次に、浮動小数点数を(relpages × 8192)
の値で除算して、各ページのバイト単位の平均サイズを得る。relpages
は、テーブル内の総ページ数を指定します。8192
はPostgreSQLのデフォルトのページサイズで、ほとんどの場合8 KBです。 クエリの結果は、テーブルの平均圧縮率を示します。 小さい値は、高い圧縮率を示す。
テーブルまたはインデックスのTPC機能を無効にする
テーブルまたはインデックスにTPC機能を使用しない場合は、次のステートメントを実行して、テーブルまたはインデックスのTPC機能を無効にします。
ALTER TABLE <tablename> SET TABLESPACE pg_default;
ALTER INDEX <indexname> SET TABLESPACE pg_default;
FAQ
RDSインスタンスのTPC機能を有効にした後、pg_dumpとpg_basebackupは期待どおりに実行されますか?
はい、pg_dumpとpg_basebackupは期待どおりに実行されます。 pg_basebackupを使用して生成されたバックアップデータを別のRDSインスタンスに復元する場合は、ターゲットRDSインスタンスのTPC機能を有効にする必要があります。