支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4

F.28. pg_prewarm — 將關聯資料預先載入到緩衝區快取 #

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

F.28.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 時,還是 PostgreSQL 在使用 buffer 時,都可能導致編號較低的區塊在讀取編號較高的區塊時被逐出。 預熱的資料也沒有受到快取逐出的特殊保護,因此其他系統活動可能會在讀取後不久逐出新預熱的區塊;相反地,預熱也可能會從快取中逐出其他資料。 由於這些原因,預熱通常在啟動時最有用,此時快取基本上是空的。

autoprewarm_start_worker() RETURNS void

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

autoprewarm_dump_now() RETURNS int8

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

F.28.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.28.3. 作者 #

Robert Haas

提交更正

如果您在文件中看到任何不正確、與您特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來回報文件問題。