数据库表存在内存中

数据库有一种机制: 一些程序启动就需要查询的表,和一些被频繁访问的表。比如:

m_ope_d

m_product_d

m_eqid_d

.

.

.

可以考虑将这些数据量不大但经常使用的的表缓存到内存当中。

做法有两种:

1、把这些基础数据存在Redis里面。每次用的时候从redis查,效率很高。但是有一个缺点,update的数据不能及时同步到redis中。

2、把这些hot data放在GP的内存中。

预热功能。使用pg_prewarm函数,方便的将数据缓存至内存中。

这个功能不是自带的,是存在在扩展包中,所以要使用前需要先添加扩展。

 

pg_prewarm(regclass, mode text default 'buffer', fork text default 'main', first_block int8 default null, last_block int8 default null) RETURNS int8

第一个参数是预热的relation。

第二个参数是要使用预热的方法

第三个参数是relation fork被预热

第四个参数是预热的第一个块号

第五个参数是预热的最后一个块号

返回值是prewarm块的数量。

 

预热方法有三种:

  • 对操作系统发出异步prefetch请求
  • 读取块的请求范围,但可能会较慢
  • 缓冲区将请求的块范围(执行的查询)读入数据库缓冲区缓存中。

 

注意,使用这些方法中的任何一种,试图预热更多的块而不是缓存的操作系统——当使用预取或读取时,或使用PostgreSQL在使用缓冲器时可能会导致较低编号的块被释放,因为较高编号的块被读入。预热数据也没有对缓存驱逐的特殊保护,因此其他系统活动可能会在读取后不久将新的预热块驱逐出去;反之,预热也可能从高速缓存中驱逐其他数据。由于这些原因,预热通常在启动时最有用,当缓存大部分为空时。

 

操作

实验环境:

CentOS 7 + PG 10.1

// 等我有时间再亲自操作

创建extension

mytest=# create extension pg_prewarm ;

CREATE EXTENSION

 

在这个实验中,我们需要借助pg_buffercache 来查看内存中的变化。

mytest=# create extension pg_buffercache ;

CREATE EXTENSION

 

我们重启一下pg

service postgresql-10 restart

 

查看内存信息

mytest=# select count(*) from pg_buffercache where relfilenode = (select relfilenode from pg_class where relname = 'test01');

count

-------

0

(1 row)

 

mytest=# select pg_prewarm('test01','buffer','main') ;

pg_prewarm

------------

2041

(1 row)

 

mytest=# select count(*) from pg_buffercache where relfilenode = (select relfilenode from pg_class where relname = 'test01');

count

-------

2041

(1 row)

 

说明表已经被缓存到内存中。

 

你可能感兴趣的:(GP,大数据存储,Java,EE)