如果您希望在不變更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資料的壓縮效果不佳。
操作步驟
透明頁壓縮功能依賴資料表空間,需要建立壓縮資料表空間。
CREATE TABLESPACE rds_compress LOCATION '/data/postgresql/rds_compress' WITH(COMPRESSION='zstd');
重要本步驟建立的資料表空間名稱、資料表空間路徑以及壓縮演算法請勿修改。
建立壓縮表或索引。
在建立或修改表、索引時指定壓縮資料表空間,使用透明頁壓縮功能。
表壓縮
-- 建立表時,指定壓縮資料表空間,即可使用透明頁壓縮功能 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> ...;
相關查詢
查詢表、索引是否建立在壓縮資料表空間下:
在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_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_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產生的備份恢複到另一個資料庫時,目標資料庫也需要開啟透明頁壓縮。