pg_prewarm
pg_prewarm 直接利用系統(tǒng)緩存的代碼,對操作系統(tǒng)發(fā)出異步prefetch請求,在應(yīng)用中,尤其在OLAP的情況下,對于大表的分析等等是非常耗費查詢的時間的,而即使我們使用select table的方式,這張表也并不可能將所有的數(shù)據(jù)都裝載到內(nèi)存中,而pg_prewarm的功能就是完成一個張表全部進入到內(nèi)存中的功能。
按照官方文檔 PostgreSQL 13的說明,預(yù)熱有兩種方式,一種是手動調(diào)用pg_prewarm函數(shù),用于將當前所需的數(shù)據(jù)裝入內(nèi)存。另一個選擇是自動執(zhí)行,要要設(shè)置shared_preload_libraries參數(shù)。設(shè)置完畢后,系統(tǒng)將自動運行一個后臺工作進程,它定期將shared_buffer中的內(nèi)容寫入到文件 autoprewarm. blocks中,以便在重新啟動數(shù)據(jù)庫后,快速加載該文件內(nèi)部的數(shù)據(jù)塊,實現(xiàn)預(yù)熱功能。
安裝與使用方式
create extension pg_prewarm;
-- t1為表名
SELECT pg_prewarm('t1');
參數(shù)
函數(shù)體為
CREATE FUNCTION pg_prewarm(regclass,
mode text default buffer,
fork text default main,
first_block int8 default null,
last_block int8 default null)
RETURNS int8
AS MODULE_PATHNAME, pg_prewarm
LANGUAGE C
- regclass:要做prewarm的表名
- mode:prewarm模式。prefetch表示異步預(yù)取到os cache;read表示同步預(yù)取;buffer表示同步讀入PG的shared buffer
- fork:relation fork的類型。一般用main,其他類型有visibilitymap和fsm
- first_block & last_block:開始和結(jié)束塊號。表的first_block=0,last_block可通過pg_class的relpages字段獲得
- RETURNS int8:函數(shù)返回pg_prewarm處理的block數(shù)目(整型)
因為對于大小超過shared_buffer/4的表進行全表掃描時,pg一般不會使用全部的shared_buffer,而是只使用很少一部分的shared_buffer。所以,將大表加載到緩存中不能用一個查詢來直接實現(xiàn)的,而pg_prewarm正好可以滿足這個需求。
性能測試
在一個3363786記錄數(shù)的業(yè)務(wù)表中,添加緩存之前的
explain (analyze,buffers) select * from t1;
添加緩存后文章來源:http://www.zghlxwxcb.cn/news/detail-622915.html
create extension pg_prewarm
SELECT pg_prewarm('t1');
explain (analyze,buffers) select * from t1;
對比上面2圖,可以看出,時間大幅度下降.文章來源地址http://www.zghlxwxcb.cn/news/detail-622915.html
到了這里,關(guān)于使用pg_prewarm緩存PostgreSQL數(shù)據(jù)庫表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!