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. vi与vim使用

    简介 Vi是一个命令行界面下的文本编辑工具(最早1976年由Bill Joy开发,原名ex),vi 支持就大多数操作系统(最早在BSD上发布)并且功能已经十分强大. 1991年Bram Moolena ...

  2. NC19115 选择颜色

    NC19115 选择颜色 题目 题目描述 \(n\) 个人排成一个环形,每个人要从 \(c\) 种颜色中选择一个. 牛牛希望相邻的人选择的颜色是不同的 问有多少种方案. 输出方案数对 \(10007\ ...

  3. Future源码一观-JUC系列

    背景介绍 在程序中,主线程启动一个子线程进行异步计算,主线程是不阻塞继续执行的,这点看起来是非常自然的,都已经选择启动子线程去异步执行了,主线程如果是阻塞的话,那还不如主线程自己去执行不就好了.那会不 ...

  4. STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  5. Docker容器搭建android编译环境

    Docker容器搭建android编译环境 目录 1 部署容器 1.1 手动部署 1.1.1 配置docker 1.1.2 启动容器 1.1.3 配置环境 1.2 Dockerfile 2 镜像管理 ...

  6. CADisplayLink、NSTimer循环引用解决方案

    前言:CADisplayLink.NSTimer 循环引用问题 ​ CADisplayLink.NSTimer会对Target产生强引用,如果target又对他们产生强引用,那么就会引发循环引用. @ ...

  7. 研发效能|Kubernetes核心技术剖析和DevOps落地经验

    本文主要介绍Kubernetes 的核心组件.架构.服务编排,以及在集群规模.网络&隔离.SideCar.高可用上的一些使用建议,尤其是在CICD中落地,什么是 GitOps. 通过此文可彻底 ...

  8. Mac Sierra开启读写NTFS

    查看卷标diskutil list sudo vim /etc/fstab,开启WinD盘符读写,添加如下: LABEL=WinD none ntfs rw,auto,nobrowse 磁盘工具重新挂 ...

  9. 初次使用 eolink 感受

    最近总有前端小伙伴来找我抱怨,"后端接口出来太晚,影响我的任务进度"."后端接口改了也不通知我一下,到冒烟测试的时候报一堆的错".我拉后端小伙伴了解情况,结果问 ...

  10. Phabricator Conduit API介绍

    在Phabricator页面,可以完成创建和编辑Project.Task等操作.但是如果想实现外部系统可以自主操作Phabricator,那么就需要调用Phabricator Conduit API, ...