PostgreSQL將數(shù)據(jù)加載到buffer cache中操作方法
我們都知道數(shù)據(jù)在緩存中訪問遠比在磁盤中訪問速度要快,那么我們怎么在pg中將指定的數(shù)據(jù)加載到緩存中呢,這有點類似于Oracle的in-memory。
當然要注意并不是把數(shù)據(jù)加載到內(nèi)存中就一定是好的,因為相較于磁盤,內(nèi)存總是有限的,所以一幫我們只是在特殊場合下將需要的數(shù)據(jù)加載到內(nèi)存中來加快訪問的速度。
我們可以使用pg_prewarm插件來將指定的表加載到OS Buffer或者pg shared buffer中。
安裝:
bill=# create extension pg_prewarm ; CREATE EXTENSION
性能測試:
構(gòu)建測試表t1,t2,分別插入1000W條測試數(shù)據(jù)
bill=# create table t1(id int,info text); CREATE TABLE bill=# create table t2(id int,info text); CREATE TABLE bill=# insert into t1 select generate_series(1,10000000),md5(random()::text); INSERT 0 10000000 bill=# insert into t2 select generate_series(1,10000000),md5(random()::text); INSERT 0 10000000
測試前先清空shared_buffer,可以使用下面sql查看shared_buffer使用情況:
安裝pg_buffercache插件:
bill=# create extension pg_buffercache; CREATE EXTENSION
查詢shared_buffer使用情況:
SELECT c.relname, count(*) AS buffers FROM pg_buffercache b INNER JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid) AND b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) GROUP BY c.relname ORDER BY 2 DESC; relname | buffers -----------------------------------------+--------- pg_attribute| 36 pg_proc | 27 pg_class | 15 pg_operator | 14 pg_depend_reference_index | 13 pg_depend | 11 pg_attribute_relid_attnum_index | 10 pg_proc_proname_args_nsp_index | 9 ......
可以看到t1和t2表均不在shared_buffer中,我們來手動將t2表加載到shared_buffer中。
bill=# SELECT pg_prewarm('t2'); pg_prewarm ------------ 83334 (1 row)
性能測試:
可以看到全表掃描t2表的性能要提升不少。
bill=# explain analyze select * from t1;QUERY PLAN ------------------------------------------------------------------------------------------------------------------ Seq Scan on t1 (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.060..772.902 rows=10000000 loops=1) Planning Time: 0.294 ms Execution Time: 1044.922 ms (3 rows) Time: 1045.722 ms (00:01.046) bill=# explain analyze select * from t2;QUERY PLAN ------------------------------------------------------------------------------------------------------------------ Seq Scan on t2 (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.012..519.691 rows=10000000 loops=1) Planning Time: 0.280 ms Execution Time: 790.607 ms (3 rows) Time: 791.314 ms
pg_prewarm其它介紹:
下面主要介紹下pg_prewarm函數(shù):
該函式的創(chuàng)建語句如下:
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
參數(shù)如下:
- regclass:要做prewarm的表名
- mode:prewarm模式。prefetch表示異步預(yù)取到os cache;read表示同步預(yù)?。籦uffer表示同步讀入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ù)目(整型)
可能有人會想:我直接將表select *全表查詢一遍不就可以將數(shù)據(jù)加載到緩存中了嘛,為什么還需要使用pg_prewarm呢?因為對于大小超過shared_buffer/4的表進行全表掃描時,pg一般不會使用全部的shared_buffer,而是只使用很少一部分的shared_buffer。所以,將大表加載到緩存中不能用一個查詢來直接實現(xiàn)的,而pg_prewarm正好可以滿足這個需求。
參考鏈接:
https://www.postgresql.org/docs/13/pgprewarm.html
https://www.postgresql.org/docs/13/pgbuffercache.html
到此這篇關(guān)于PostgreSQL將數(shù)據(jù)加載到buffer cache中的文章就介紹到這了,更多相關(guān)PostgreSQL數(shù)據(jù)加載buffer cache內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。