2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4

F.30. pg_prewarm — 將關係資料預載入到緩衝區快取 #

pg_prewarm 模組提供了一種方便的方式,將關係資料載入到作業系統緩衝區快取或 PostgreSQL 緩衝區快取中。預熱可以透過使用 pg_prewarm 函式手動執行,也可以透過將 pg_prewarm 包含在 shared_preload_libraries 中自動執行。在後一種情況下,系統將執行一個後臺工作程序,它會定期將共享緩衝區的 contents 記錄在一個名為 autoprewarm.blocks 的檔案中,並在重啟後使用 2 個後臺工作程序重新載入這些相同的塊。

F.30.1. 函式 #

pg_prewarm(regclass, mode text default 'buffer', fork text default 'main',
           first_block int8 default null,
           last_block int8 default null) RETURNS int8

第一個引數是要預熱的關係。第二個引數是要使用的預熱方法,如下所述;第三個引數是要預熱的關係分叉,通常是 main。第四個引數是要預熱的第一個塊號(NULL 被接受為零的同義詞)。第五個引數是要預熱的最後一個塊號(NULL 表示預熱到關係中的最後一個塊)。返回值是預熱的塊數。

有三種可用的預熱方法。prefetch 向作業系統發出非同步預取請求,如果支援則執行,否則丟擲錯誤。read 讀取請求的塊範圍;與 prefetch 不同,這是一種同步操作,在所有平臺和構建上都受支援,但可能較慢。buffer 將請求的塊範圍讀取到資料庫緩衝區快取中。

請注意,使用任何這些方法,嘗試預熱比可以快取的塊更多的塊——當使用 prefetchread 時由作業系統快取,或當使用 buffer 時由 PostgreSQL 快取——可能會導致較低編號的塊在讀取較高編號的塊時被逐出。預熱資料也不會受到特殊保護免受快取逐出,因此新預熱的塊在讀取後不久可能被其他系統活動逐出;反之,預熱也可能將其他資料從快取中逐出。出於這些原因,預熱通常在啟動時最有用,那時快取大致是空的。

autoprewarm_start_worker() RETURNS void

啟動主 autoprewarm 工作程序。這通常會自動發生,但如果伺服器啟動時未配置自動預熱,並且您希望稍後啟動工作程序,則此功能很有用。

autoprewarm_dump_now() RETURNS int8

立即更新 autoprewarm.blocks。如果 autoprewarm 工作程序未執行,但您預計在下次重啟後執行它,這可能會很有用。返回值是寫入 autoprewarm.blocks 的記錄數。

F.30.2. 配置引數 #

pg_prewarm.autoprewarm (boolean)

控制伺服器是否應執行 autoprewarm 工作程序。預設情況下啟用。此引數只能在伺服器啟動時設定。

pg_prewarm.autoprewarm_interval (integer)

這是 autoprewarm.blocks 更新之間的間隔。預設值為 300 秒。如果設定為 0,則檔案不會按固定間隔轉儲,只有在伺服器關閉時才會轉儲。

這些引數必須在 postgresql.conf 中設定。典型的用法可能是

# postgresql.conf
shared_preload_libraries = 'pg_prewarm'

pg_prewarm.autoprewarm = true
pg_prewarm.autoprewarm_interval = 300s

F.30.3. 作者 #

Robert Haas

提交更正

如果您在文件中發現任何不正確之處、與您對特定功能的體驗不符或需要進一步澄清的地方,請使用 此表單 報告文件問題。