時間:2021-04-19來源:www.outletmksalestore.com作者:電腦系統城
我們都知道數據在緩存中訪問遠比在磁盤中訪問速度要快,那么我們怎么在pg中將指定的數據加載到緩存中呢,這有點類似于Oracle的in-memory。
當然要注意并不是把數據加載到內存中就一定是好的,因為相較于磁盤,內存總是有限的,所以一幫我們只是在特殊場合下將需要的數據加載到內存中來加快訪問的速度。
我們可以使用pg_prewarm插件來將指定的表加載到OS Buffer或者pg shared buffer中。
1 2 |
bill=# create extension pg_prewarm ; CREATE EXTENSION |
構建測試表t1,t2,分別插入1000W條測試數據
1 2 3 4 5 6 7 8 |
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插件:
1 2 |
bill=# create extension pg_buffercache; CREATE EXTENSION |
查詢shared_buffer使用情況:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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中。
1 2 3 4 5 |
bill=# SELECT pg_prewarm( 't2' ); pg_prewarm ------------ 83334 (1 row) |
可以看到全表掃描t2表的性能要提升不少。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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函數:
該函式的創建語句如下:
1 2 3 4 5 6 7 8 |
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 |
參數如下:
可能有人會想:我直接將表select *全表查詢一遍不就可以將數據加載到緩存中了嘛,為什么還需要使用pg_prewarm呢?因為對于大小超過shared_buffer/4的表進行全表掃描時,pg一般不會使用全部的shared_buffer,而是只使用很少一部分的shared_buffer。所以,將大表加載到緩存中不能用一個查詢來直接實現的,而pg_prewarm正好可以滿足這個需求。
https://www.postgresql.org/docs/13/pgprewarm.html
https://www.postgresql.org/docs/13/pgbuffercache.html
到此這篇關于PostgreSQL將數據加載到buffer cache中的文章就介紹到這了,更多相關PostgreSQL數據加載buffer cache內容請搜索腳本之家以前的文章
2022-02-25
系統城教小白如何在Centos8-stream安裝PostgreSQL132021-04-22
自定義函數實現單詞排序并運用于PostgreSQL(實現代碼)2021-04-19
MySQL命令行操作時的編碼問題詳解玩游戲的時候最怕跳出什么程序來干擾游戲,很多玩家在玩游戲過程中會遇到輸入法彈出來,影響游戲體驗,Win10玩游戲老跳出來輸入法怎么辦?按照以下的方法操作就可以解決這個問題了...
2021-02-19