すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:TPC機能を使用する

最終更新日:Dec 16, 2024

インスタンスタイプを変更せずに、ストレージ使用量を削減し、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データに対して不十分に機能します。

手順

  1. 機能はテーブルスペースに依存するため、TPC機能を使用するために圧縮用のテーブルスペースを作成します。

    CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');
    重要

    この手順で作成されるテーブルスペースの名前、パス、および圧縮アルゴリズムは変更しないでください。

  2. 圧縮用のテーブルまたはインデックスを作成します。

    • テーブルとインデックスを作成または変更するときは、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> ...;

関連クエリ

  • テーブルまたはインデックスが圧縮用のテーブルスペースに作成されているかどうかを確認します。

    1. 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_sizepg_tablespace_sizepg_relation_sizepg_table_sizepg_index_sizepg_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機能を有効にする必要があります。