PostgreSQL将数据加载到buffer cache中操作方法( 二 )


————
      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 mspg_prewarm其它介绍:
下面主要介绍下pg_prewarm函数:
该函式的创建语句如下:
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表示异步预取到os cache;read表示同步预取;buffer表示同步读入PG的shared buffer
fork:relation fork的类型 。一般用main , 其他类型有visibilitymap和fsm
first_block & last_block:开始和结束块号 。表的first_block=0 , last_block可通过pg_class的relpages字段获得
RETURNS int8:函数返回pg_prewarm处理的block数目(整型)
可能有人会想:我直接将表select *全表查询一遍不就可以将数据加载到缓存中了嘛 , 为什么还需要使用pg_prewarm呢?因为对于大小超过shared_buffer/4的表进行全表扫描时 , pg一般不会使用全部的shared_buffer , 而是只使用很少一部分的shared_buffer 。所以 , 将大表加载到缓存中不能用一个查询来直接实现的 , 而pg_prewarm正好可以满足这个需求 。
文章来源:脚本之家
来源地址:https://www.jb51.net/article/209711.htm
申请创业报道 , 分享创业好点子 。 , 共同探讨创业新机遇!