全部產品
Search
文件中心

PolarDB:表大小緩衝(RSC)

更新時間:Jan 27, 2026

本文介紹了PolarDB PostgreSQL版的表大小緩衝功能。

背景資訊

在一條SQL被資料庫執行的生命週期中,存在若干次對系統資料表和使用者表及其索引的查詢。在這個過程中,PolarDB PostgreSQL版會頻繁通過儲存管理層(Storage Manager, smgr)的smgrnblocks介面擷取表檔案的塊數量。smgrnblocks最終通過檔案系統的lseek介面擷取檔案長度,並根據塊大小計算出塊數量。由於smgrnblocks處於SQL處理的關鍵路徑上,頻繁調用檔案系統介面會嚴重影響資料庫的效能。對於使用Distributed File System的PolarDB PostgreSQL版來說,調用PolarFS lseek的時延遠高於單機檔案系統的lseek,從而拖慢SQL的執行時間。

為了降低對檔案系統的調用頻率,PolarDB PostgreSQL版在儲存管理層實現了對錶檔案塊數量的緩衝(Relation Size Cache, RSC),在共用記憶體中緩衝表的塊數量,並在表的塊數量發生變化時更新共用記憶體中的緩衝值。對錶檔案塊數量的查詢將優先使用緩衝,從而降低對檔案系統的請求次數,加快SQL的執行速度。

適用範圍

支援的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 18(核心小版本2.0.18.0.1.0及以上)

  • PostgreSQL 17(核心小版本2.0.17.2.1.0及以上)

  • PostgreSQL 16(核心小版本2.0.16.3.1.1及以上)

  • PostgreSQL 15(核心小版本2.0.15.7.1.1及以上)

  • PostgreSQL 14(核心小版本2.0.14.12.23.1及以上)

說明

您可在控制台查看核心小版本號碼,也可以通過SHOW polardb_version;語句查看。如未滿足核心小版本要求,請升級核心小版本

功能介紹

RSC查詢

RSC由共用記憶體中的一維數組與雜湊表組成:

  • 一維數組中的每一個快取項目都儲存了一個Relation(表或索引)的塊數量。

  • 雜湊表記錄了Relation的儲存層唯一識別碼RelFileNode與數組中快取項目的映射關係。

所有進程將通過依次通過以下兩級索引來嘗試查詢RSC:

  • 第一級索引:緩衝上一次訪問的RSC快取項目的指標和版本號碼(generation)。如果本次訪問的表與上次訪問的表相同,且指標指向的RSC快取項目的版本號碼沒有被修改過,那麼進程可以直接通過指向快取項目的指標得到表的塊數量。在對特定表的讀多寫少的情境中,第一級索引能夠以較高的機率被命中。當RSC雜湊表中的映射關係發生變化時,除了雜湊表本身需要被修改,相對應的RSC快取項目版本號碼需要被自增,以便讓RSC的第一級索引失效。

  • 第二級索引:當第一級索引失效時,通過查詢共用記憶體中的雜湊表可以得到當前表對應的RSC快取項目,得到表的塊數量,並更新第一級索引。

如果通過上述兩級索引都無法在RSC中查詢到表和對應的塊數量,將會觸發RSC緩衝淘汰,使用SLRU演算法選擇一個最近不怎麼被使用的RSC快取項目清空。接下來會真正調用檔案系統的lseek,並將得到的塊數量更新到剛才清空的RSC快取項目中,並同步更新上述兩級索引。

RSC更新(Primary/Standby節點)

開啟RSC緩衝功能後,涉及到表檔案大小變更的儲存管理層介面,需要同步更新共用記憶體中的RSC快取項目,確保緩衝中表的塊數量值與檔案系統中的實際塊數量一致。

  • 在表檔案擴充(extend)頁面的介面中,需要將擴充後的表檔案塊數量更新到RSC中。

  • 在表檔案截斷(truncate)的介面中,需要將截斷後的表檔案塊數量更新到RSC中。

Standby節點由於採用物理複製與Primary節點同步,在回放WAL日誌的過程中,同樣會調用上述的儲存管理層介面修改表的檔案長度,故RSC緩衝的更新方式與Primary節點無異。

RSC更新(Replica節點)

Replica節點與Primary節點共用實體儲存體,使用LogIndex機制與Primary節點同步。Replica節點不對儲存做寫操作,因此無法在儲存管理層的介面中更新記憶體中的RSC緩衝值。

Replica節點通過解析WAL日誌中引用的資料區塊編號,與當前RSC緩衝中的塊數量值做比較,判斷共用儲存上的檔案是否發生了長度變更。如果解析到WAL日誌中的塊編號已經超過了當前緩衝的塊數量,那麼將RSC緩衝中的值更新到被引用資料區塊所在的塊數量。如果解析到表示檔案發生了截斷的WAL日誌,那麼直接丟棄RSC中緩衝的塊數量,等待下一次檔案系統調用重新填充緩衝。

使用指南

GUC參數

RSC提供如下GUC參數控制:

參數

描述

polar_enable_rel_size_cache

是否開啟RSC功能,取值範圍如下:

  • on(預設值):開啟RSC功能。

  • off:關閉RSC功能。

polar_enable_replica_rel_size_cache

Replica節點是否開啟RSC功能,取值範圍如下:

  • on(預設值):Replica節點開啟RSC功能。

  • offReplica節點關閉RSC功能。

polar_enable_standby_rel_size_cache

Standby節點是否開啟RSC功能,取值範圍如下:

  • on(預設值):Standby節點開啟RSC功能。

  • offStandby節點關閉RSC功能。

效能測試

  • RSC關閉時,對32 GB表的塊數量請求延時約為55 us:

    SHOW polar_enable_rel_size_cache;
     polar_enable_rel_size_cache
    -----------------------------
     off
    (1 row)
    
    SELECT polar_smgrperf_nblocks(32, true, false);
    NOTICE:  testing logical file length with 32 GB
    INFO:  iops=18341.1/s, lat=54.52us
    INFO:  iops=17504.0/s, lat=57.13us
    INFO:  iops=17960.8/s, lat=55.68us
    INFO:  iops=17973.0/s, lat=55.64us
    INFO:  iops=17603.5/s, lat=56.81us
    INFO:  iops=17403.8/s, lat=57.46us
    INFO:  iops=17506.2/s, lat=57.12us
    INFO:  iops=18061.7/s, lat=55.37us
  • RSC開啟時,對32 GB表的塊數量請求延時約為0.07 us:

    SHOW polar_enable_rel_size_cache;
     polar_enable_rel_size_cache
    -----------------------------
     on
    (1 row)
    
    SELECT polar_smgrperf_nblocks(32, true, false);
    NOTICE:  testing logical file length with 32 GB
    INFO:  iops=14155515.6/s, lat=0.07us
    INFO:  iops=13897273.6/s, lat=0.07us
    INFO:  iops=13869926.3/s, lat=0.07us
    INFO:  iops=13779602.7/s, lat=0.07us
    INFO:  iops=14159120.5/s, lat=0.07us
    INFO:  iops=14147065.6/s, lat=0.07us
    INFO:  iops=14124141.9/s, lat=0.07us
    INFO:  iops=14162773.3/s, lat=0.07us