全部產品
Search
文件中心

:透明頁壓縮TPC

更新時間:Jun 19, 2024

如果您希望在不變更RDS PostgreSQL執行個體規格的前提下,減少儲存空間佔用,提高資料庫讀取效能,則可以參考本文,使用透明頁壓縮功能。該功能犧牲部分CPU效能,對Buffer Pool中的頁資料進行即時壓縮和解壓縮,可以有效降低儲存成本、提高I/O吞吐。

前提條件

RDS PostgreSQL執行個體版本需要滿足以下條件:

  • 執行個體大版本:14或以上版本。

  • 核心小版本:大於等於20240530,如需升級核心小版本,請參見升級核心小版本

什麼是透明頁壓縮

透明頁壓縮 TPC(Transparent Page Compression)中,頁壓縮指對Buffer Pool中的頁執行即時的I/O壓縮和解壓縮,透明是指使用過程中無感知,資料在寫入磁碟時自動壓縮,資料在從磁碟讀取時自動解壓縮。

透明頁壓縮的主要目標是減少儲存空間的使用,並提高資料庫的讀效能。通過壓縮資料,可以降低磁碟I/O,減少儲存,提高緩衝效率,並加快資料轉送速度。

應用情境

CPU使用率在50%以下,IOPS或IO吞吐容易達到瓶頸的情境下,推薦使用透明頁壓縮功能。

透明頁壓縮的優勢

  • 儲存成本平均可節約50%。

  • IO使用平均可節約50%。

  • TPS在讀情境會有提高,部分IO打滿的讀情境最高可提升100%。

影響

  • 該功能會使CPU使用量上漲,壓縮的CPU上漲約260%,解壓的CPU上漲約40%。

  • 在寫情境TPS會有下降。

  • 對TOAST資料的壓縮效果不佳。

操作步驟

  1. 透明頁壓縮功能依賴資料表空間,需要建立壓縮資料表空間。

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

    本步驟建立的資料表空間名稱、資料表空間路徑以及壓縮演算法請勿修改。

  2. 建立壓縮表或索引。

    • 在建立或修改表、索引時指定壓縮資料表空間,使用透明頁壓縮功能。

      • 表壓縮

        -- 建立表時,指定壓縮資料表空間,即可使用透明頁壓縮功能
        CREATE TABLE <tablename> ... TABLESPACE rds_compress;
        
        -- 將現有表的資料表空間修改為壓縮資料表空間
        ALTER TABLE <tablename> SET TABLESPACE rds_compress;
      • 索引壓縮

        -- 建立索引時,指定壓縮資料表空間,即可使用透明頁壓縮功能
        CREATE INDEX <indexname> ... TABLESPACE rds_compress;
        
        -- 將現有索引的資料表空間修改為壓縮資料表空間
        ALTER INDEX <indexname> SET TABLESPACE rds_compress;
    • 修改預設資料表空間為壓縮資料表空間,後續建立的表和索引,將預設使用透明頁壓縮功能。

      -- 設定預設資料表空間為壓縮資料表空間
      SET default_tablespace TO 'rds_compress';
      
      -- 建立表、索引時無需指定資料表空間,預設使用透明頁壓縮功能。
      CREATE TABLE <tablename> ...;
      CREATE INDEX <indexname> ...;

相關查詢

  • 查詢表、索引是否建立在壓縮資料表空間下:

    1. 在psql命令列中輸入\d+ <表名>查詢指定表的詳細資料。

      如果表和索引都建立在壓縮資料表空間下,則表示可以使用透明頁壓縮功能。以下為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_class系統目錄,使用pg_relation_size('<tablename>') 函數擷取指定表的實際磁碟佔用空間大小(以位元組為單位)並轉換為浮點數,通過除以 (relpages * 8192)計算得出每個頁面的平均大小(以位元組為單位)。其中relpages是表的總頁面數,8192是PostgreSQL預設的頁面大小(通常為8KB),最終,查詢的結果表示指定表的平均壓縮比率。值越小,表示壓縮比越高。

將壓縮的表、索引轉為非壓縮的表、索引

當您不再使用透明頁壓縮功能時,執行如下命令可以將壓縮的表、索引轉為非壓縮的表、索引。

ALTER TABLE <tablename> SET TABLESPACE pg_default;
ALTER INDEX <indexname> SET TABLESPACE pg_default;

常見問題

Q:開啟透明頁壓縮TPC後,資料庫工具(pg_dump,pg_basebackup)還能正常使用嗎?

A:pg_dump和pg_basebackup工具可以正常使用,其中如果要將pg_basebackup產生的備份恢複到另一個資料庫時,目標資料庫也需要開啟透明頁壓縮。