我们都知道数据在缓存中访问远比在磁盘中访问速度要快,那么我们怎么在程序制导中将指定的数据加载到缓存中呢,这有点类似于神谕的内存中。

当然要注意并不是把数据加载到内存中就一定是好的,因为相较于磁盘,内存总是有限的,所以一帮我们只是在特殊场合下将需要的数据加载到内存中来加快访问的速度。

我们可以使用pg _预警插件来将指定的表加载到操作系统缓冲或者程序制导共享缓冲区中。

安装:

bill=# create extension pg _ prewarm;

创建扩展

性能测试:

构建测试表t1,t2,分别插入1000瓦条测试数据

bill=# create table t1(id int,info text);

创建表格

bill=# create table t2(id int,info text);

创建表格

bill=# insert into t1 select generate _ series(1,10000000),MD5(random():text);

插入0 10000000

bill=# insert into T2 select generate _ series(1,10000000),MD5(random():text);

插入0 10000000

测试前先清空共享缓冲区,可以使用下面结构化查询语言查看共享缓冲区使用情况:

安装pg _缓冲区缓存插件:

bill=# create extension pg _ buffer cache;

创建扩展

查询共享缓冲区使用情况:

挑选

c.relname,

作为缓冲区计数(*)

来自pg_buffercache b

内部联接pg _级

ON b . rel filenode=pg _ relation _ filenode(c . oid)

和(0,(从pg _数据库中选择似…的

其中datname=current_database()))

按c.relname分组

由2 DESC订购;

relname |缓冲区

– –

pg_attribute | 36

pg_proc | 27

pg_class | 15

pg_operator | 14

pg_depend_reference_index | 13

pg _dep赖| 11

pg _ attribute _ relid _ attnum _ index | 10

pg _ proc _ proname _ args _ NSP _ index | 9

.

可以看到一种网络的名称(传输率可达1.54mbps)级(一种通讯线路的名称)和t2表均不在共享缓冲区中,我们来手动将t2表加载到共享缓冲区中。

bill=# SELECT pg _ prewarm(‘ T2 ‘);

pg _预警

83334

(1行)

性能测试:

可以看到全表扫描t2表的性能要提升不少。

bill=# explain analyze select * from t1;

查询计划

T1级(一种通讯线路的名称)上的序列扫描(成本=0.00.183334.80行=10000080宽=37)(实际时间=0.060).772.902行=10000000个循环=1)

规划时间:0.294毫秒

执行时间:1044.922毫秒

(3排)

时间:1045.722毫秒(00:01.046)

比尔=#解释分析从t2中选择*

查询计划

t2上的序列扫描(成本=0.00.183334.80行=10000080宽=37)(实际时间=0.012.519.691行=10000000个循环=1)

规划时间:0.280毫秒

执行时间:790.607毫秒

(3排)

时间:791.314 mspg _预警其它介绍:

下面主要介绍下pg _预警函数:

该函式的创建语句如下:

创建函数pg_prewarm(regclass,

模式文本默认缓冲区,

分叉文本默认主要,

first_block int8默认为空,

last_block int8默认为空)

返回int8

作为模块路径名,第_预警

语言C

参数如下:

regclass:要做预警的表名

模式:预警模式预取表示异步预取到操作系统缓存;阅读表示同步预取;缓冲器表示同步读入宜在家长指导下观看的的共享缓冲区

分叉:关系分叉的类型。一般用主要的,其他类型有可视性地图和有限状态机(有限状态机的缩写)

第一个块最后一个块:开始和结束块号。表的first_block=0,last_block可通过pg_class的重新分页字段获得

返回int8:函数返回pg _预警处理的街区数目(整型)

可能有人会想:我直接将表选择*全表查询一遍不就可以将数据加载到缓存中了嘛,为什么还需要使用pg _预警呢?因为对于大小超过共享缓冲区/4的表进行全表扫描时,第页一般不会使用全部的共享缓冲区,而是只使用很少一部分的共享缓冲区。所以,将大表加载到缓存中不能用一个查询来直接实现的,而pg _预警正好可以满足这个需求。

文章来源:脚本之家

来源地址:https://www。JB 51。网/文章/209711。html文件的后缀

发表回复

后才能评论