Oracle 在查询数据 可以通过cache hint 所访问的数据cache 到数据库buffer,对于KingbaseES,如何将数据加载到cache 了?sys_prewarm 扩展插件可以实现数据的cache

一、准备数据

test=# create table prewarm_test1(id integer,name text);
CREATE TABLE
test=# insert into prewarm_test1 select generate_series(1,3000000),md5(random()::text);
INSERT 0 3000000
test=# select pg_size_pretty(pg_relation_size('prewarm_test1'));
pg_size_pretty
----------------
195 MB
(1 row) create table prewarm_test2 as select * from prewarm_test1; create index ind_prewarm_test2 on prewarm_test2(id);

二、select 操作与 cache

1、统计cache信息的脚本

为了取得cache 的信息,必须安装 sys_buffercache 扩展插件。cache 统计的脚本如下:

select c.relname, count(*) as buffers
from sys_buffercache b
inner join pg_class c on b.relfilenode = pg_relation_filenode(c.oid)
and b.reldatabase in (0, (select oid from pg_database where datname = current_database()))
group by c.relname
order by 2 desc;

2、全表访问

为了保证数据准确,在访问之前,必须先重启下数据库(清理shared_buffer)。

数据库刚启动是的buffer 状态:

                 relname                 | buffers
-----------------------------------------+---------
pg_attribute | 36
pg_class | 25
pg_proc | 13

全表访问 1 次后的buffer 状态:

test=# select count(*) from prewarm_test1;
count
---------
3000000
(1 row) relname | buffers
-----------------------------------------------+---------
prewarm_test1 | 96
pg_attribute | 36
pg_class | 25

再次 全表访问后的状态:

test=# select count(*) from prewarm_test1;
count
---------
3000000
(1 row) relname | buffers
-----------------------------------------------+---------
prewarm_test1 | 192
pg_attribute | 36
pg_class | 25

结论:可以看到全表全表访问并不会把全部的数据缓存。对于大小超过shared_buffer/4的表进行全表扫描时,不会使用全部的shared_buffer,而是只使用很少一部分的shared_buffer。

3、索引访问

test=# end;
test=# \set SQLTERM /
test=# declare
test-# v_temp integer;
test-# begin
test-# for i in 1..3000000 loop
test-# select id into v_temp from prewarm_test2 where id=i;
test-# end loop;
test-# end;
test-# /
ANONYMOUS BLOCK relname | buffers
-----------------------------------------+---------
prewarm_test2 | 12287
ind_prewarm_test2 | 4044
pg_class | 25

结论:通过索引访问的块,会缓存在cache中

三、sys_prewarm

1、创建sys_prewarm 扩展

test=# create extension sys_prewarm;
CREATE EXTENSION
test=# \dx+ sys_prewarm
Objects in extension "sys_prewarm"
Object description
--------------------------------------------------------
function autoprewarm_dump_now()
function autoprewarm_start_worker()
function sys_extend(regclass,bigint)
function sys_prewarm(regclass,text,text,bigint,bigint)
(4 rows)

2、sys_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数目(整型)

3、验证sys_prewarm 函数

test=# select sys_prewarm('prewarm_test1');
sys_prewarm
-------------
25000
(1 row) relname | buffers
-----------------------------------------------+---------
prewarm_test1 | 16026
pg_proc | 114
pg_attribute | 36

结论:运行 sys_prewarm 后,可以看到数据被有效缓存了。

4、sys_extend 函数

sys_extend 用于预先一次性扩展数据文件大小,避免数据增长的同时在去扩展文件,可以有效的提升性能。

Tips :对于fdatasync , 文件的尺寸(st_size)如果变化,是需要立即同步的,否则OS一旦崩溃,即使文件的数据部分已同步,由于metadata没有同步,依然读不到修改的内容。而最后访问时间(atime)/修改时间(mtime)是不需要每次都同步的,只要应用程序对这两个时间戳没有苛刻的要求,基本无伤大雅。

test=# select relname,relpages from sys_class where relname='prewarm_test1';
relname | relpages
---------------+----------
prewarm_test1 | 25000
(1 row) test=# select sys_extend('prewarm_test1',10000);
sys_extend
------------
t
(1 row) test=# analyze prewarm_test1;
ANALYZE
test=# select relname,relpages from sys_class where relname='prewarm_test1';
relname | relpages
---------------+----------
prewarm_test1 | 35000
(1 row)

这里表示数据文件的大小扩展 10000 个数据块。

KingbaseES sys_prewarm 扩展的更多相关文章

  1. KingbaseES DBLink 扩展介绍

    DBLink 扩展插件功能与 Kingbase_FDW 类似,用于远程访问KingbaseES 数据库.相比于Kingbase_FDW,DBLink 功能更强大,可以执行DML,还可以通过 begin ...

  2. KingbaseES 与 Oracle 用户口令管理与资源管理

    一.概述 KingbaseES可以对用户口令与用户占用资源进行必要的管理.其管理方式,在这里与Oracle数据库进行参考比较. KingbaseES 使用扩展插件建立的系统参数,这组参数可以对数据库资 ...

  3. KingbaseES 支持pivot and unpivot 功能

    KingbaseES 通过扩展插件支持了pivot 和unpivot 功能.以下以例子的方式介绍. 一.功能介绍 创建扩展: create extension kdb_utils_function; ...

  4. KingbaseES interval 分区表介绍

    KingbaseES从V008R006C005B0041版本开始支持Oracle的Interval分区表功能. Interval分区表是一种特殊的范围分区表.当执行INSERT或者UPDATE时,若数 ...

  5. 如何充分利用KingbaseES日志

    作为现代关系数据库中,KingbaseES带有许多用于微调的参数.需要考虑的领域之一是KingbaseES应该如何记录其活动.日志记录在Kingbases数据库管理中经常被忽略,如果不被忽略,通常会被 ...

  6. KingbaseES 时间类型数据和oracle时间类型的区别

    Oracle日期时间类型有两类,一类是日期时间类型,包括Date, Timestamp with time zone, Timestamp with local time zone.另一类是Inter ...

  7. KingbaseES Hint 使用

    前言:KingbaseES V8R6C4 之前版本hint 使用方法是与Postgresql 相同的,通过 pg_hint_plan扩展,支持在SQL中使用hint.由于该版本的hint只能放置于SQ ...

  8. KingbaseES 实现MYSQL hex/unhex 函数

    MySQL 的hex 和 unhex 函数类似于KingbaseES 的encode 和 decoding,实现字符与16进制之间的转换. 一.先看MySQL例子 mysql> select h ...

  9. KingbaseES的表空间

    表空间的概念 KingbaseES中的表空间允许在文件系统中定义用来存放表示数据库对象的文件的位置.实际上表空间就是给表指定一个存储目录. 表空间的作用 通过使用表空间,管理员可以控制一个Kingba ...

随机推荐

  1. SAP MM- BAPI_PO_CHANGE 更新PO version 信息(version management)

    目的 Version 信息的Complated 字段,自动打勾 实例程序 *&--------------------------------------------------------- ...

  2. 关于nginx 和 uwsgi

    关于nginx和uWSGI和Django之间的关系,我觉得要理一下. 原文链接 为什么要用nginx 因为我们要使用https协议访问.(y总说django不支持,但是我查了一下,django也可以支 ...

  3. 单片机 MCU 固件打包脚本软件

    ​ 1 前言 开发完 MCU 软件后,通常都会生成 hex 文件或者 bin 文件,用来做固件烧录或者升级,如果用来做产品开发,就涉及到固件版本的问题,初学者通常采用固件文件重命名来区分版本. 如果需 ...

  4. windows如何结束某个端口的进程

    netstat -ano | findstr 端口号 (查询端口号被哪个进程占用) tasklist | findstr 进程PID (根据PID找到进程名称) taskkill -PID 进程PID ...

  5. 016(剪花布条)(KMP)

    题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目思路:KMP模板题,该说的都在代码里 #include<bits/stdc++. ...

  6. PTA(BasicLevel)-1094 谷歌的招聘

    一.问题定义 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址, 而前面的网址是一个 10 位素数,这个素数 ...

  7. ESP分区重建,解决各种引导问题

    电脑装了双系统,win7和win10,每次重启都进入不同系统,郁闷至极,索性把不常用的Win7盘格式化,但依旧解决不了问题.所以有了以下方法. 1.进PE删除ESP分区(先备份). 2.新建ESP分区 ...

  8. [ERROR] Another process with pid 914 is using unix socket file.

    mysql启动报错 1.首先到mysql的配置文件中,确定socket文件路径 vim /etc/my.cnf 2.删除mysql.sock.lock 3.启动mysql

  9. Vue 配置代理

    说明:这里的vue代理是指用vue静态服务器做代理.使用的是 http-proxy-middleware 这个模块(这个模块相当于是node.js的一个插件). 版本: vue-cli 3.0以上 修 ...

  10. 移动web开发01

    pc端的支持情况.IE9以下的版本就会全军覆没.移动端就不会出现版本支持问题. 因为第一个孩子是p,但是他又是在span里面选,所以根本选不出来,报错.改成第二个孩子才可以选出来. 这样就可以选出sp ...