我们都知道数据在缓存中访问远比在磁盘中访问速度要快,那么我们怎么在程序制导中将指定的数据加载到缓存中呢,这有点类似于神谕的记忆中的。
当然要注意并不是把数据加载到内存中就一定是好的,因为相较于磁盘,内存总是有限的,所以一帮我们只是在特殊场合下将需要的数据加载到内存中来加快访问的速度。
我们可以使用pg_prewarm插件来将指定的表加载到操作系统缓冲区或者程序制导共享缓冲区中。
安装:
bill=# create extension pg _ pre warm;
创建扩展
性能测试:
构建测试表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)(:文本);
插入0 10000000
bill=# insert into T2 select generate _ series(1,10000000),MD5(random)(:文本);
插入0 10000000
测试前先清空共享缓冲区,可以使用下面结构化查询语言查看共享缓冲区使用情况:
安装pg_buffercache插件:
bill=# create extension pg _ buffer cache;
创建扩展
查询共享缓冲区使用情况:
选择
c.relname,
计数(*)作为缓冲区
从pg_buffercache b
内部连接pg _类
ON b . relfile节点=pg _ relation _ file节点(c . oid)
和b .重新建立数据库(0,(从pg _数据库中选择似…的
WHERE datname=current_database()))
GROUP BY c.relname
订单由2 desc;
relname |缓冲区
- -
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
.
可以看到一种网络的名称(传输率可达1.54mbps)级(一种通讯线路的名称)和t2表均不在共享缓冲区中,我们来手动将t2表加载到共享缓冲区中。
bill=# SELECT pg _ pre warm(' T2 ');
pg_prewarm唐山百度优化
-
83334
(1行)
性能测试:
可以看到全表扫描t2表的性能要提升不少。
比尔=#解释分析选择*来自t1;
查询计划
-
T1级(一种通讯线路的名称)上的序列扫描(成本=0.00.183334.80行=10000080宽度=37(实际时间=0.060.772.902行=10000000个循环=1)
计划时间: 0.294毫秒
执行时间: 1044.922毫秒