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  
申请创业报道 , 分享创业好点子 。 , 共同探讨创业新机遇!  


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。