インスタンスタイプを変更せずに、ストレージ使用量を削減し、ApsaraDB RDS for PostgreSQLインスタンスの読み取りパフォーマンスを向上させたい場合は、透過ページ圧縮 (TPC) 機能を使用できます。 この機能は、バッファプール内のページデータをリアルタイムで圧縮および解凍します。 これにより、ストレージコストが効果的に削減され、I/Oスループットが向上します。 しかしながら、この特徴はCPU性能を低下させる。
前提条件
RDSインスタンスは次の要件を満たしています。
RDSインスタンスはPostgreSQL 14以降を実行します。
RDSは20240530以降のマイナーエンジンバージョンを実行します。 マイナーエンジンバージョンの更新方法の詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
機能の説明
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が減少します。
TPC機能は、TOASTデータに対して不十分に機能します。
手順
機能はテーブルスペースに依存するため、TPC機能を使用するために圧縮用のテーブルスペースを作成します。
CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');
重要この手順で作成されるテーブルスペースの名前、パス、および圧縮アルゴリズムは変更しないでください。
圧縮用のテーブルまたはインデックスを作成します。
テーブルとインデックスを作成または変更するときは、TPC機能を使用するために圧縮するテーブルスペースを指定します。
テーブル圧縮
-- When you create a table, specify the tablespace for compression to use the TPC feature. CREATE TABLE <tablename> ... TABLESPACE rds_compress; -- When you modify a table, change the tablespace of the table to the tablespace for compression. ALTER TABLE <tablename> SET TABLESPACE rds_compress;
インデックス圧縮
-- When you create an index, specify the tablespace for compression to use the TPC feature. CREATE INDEX <indexname> ... TABLESPACE rds_compress; -- When you modify an index, change the tablespace of the index to the tablespace for compression. ALTER INDEX <indexname> SET TABLESPACE rds_compress;
デフォルトのテーブルスペースを圧縮用のテーブルスペースに変更します。 このように、TPC機能はデフォルトで新しいテーブルとインデックスに使用されます。
-- Set the default tablespace to the tablespace for compression. SET default_tablespace TO 'rds_compress'; -- When you create a table or an index, you do not need to specify a tablespace. By default, the TPC feature is used. CREATE TABLE <tablename> ...; CREATE INDEX <indexname> ...;
関連クエリ
テーブルまたはインデックスが圧縮用のテーブルスペースに作成されているかどうかを確認します。
psqlコマンドラインで、
\d + <テーブル名>
を入力して、テーブルの詳細を照会します。テーブルとインデックスが圧縮用のテーブルスペースに作成されている場合は、TPC機能を使用できます。 次の出力は、sysbenchテーブルのスキーマを示しています。
Table "public.sbtest1" Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description --------+----------------+-----------+----------+-------------------------------------+----------+-------------+--------------+------------- id | integer | | not null | nextval('sbtest1_id_seq'::regclass) | plain | | | k | integer | | not null | 0 | plain | | | c | character(120) | | not null | ''::bpchar | extended | | | pad | character(60) | | not null | ''::bpchar | extended | | | Indexes: "sbtest1_pkey" PRIMARY KEY, btree (id), tablespace "rds_compress" "k_1" btree (k), tablespace "rds_compress" Tablespace: "rds_compress" Access method: heap
データが圧縮されているかどうかを確認します。
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機能を有効にする必要があります。