• 金仓数据库KingbaseES sys_prewarm 扩展


    目录

    一、准备数据

    二、select 操作与 cache

    1、统计cache信息的脚本

    2、全表访问

    3、索引访问

    三、sys_prewarm 

    1、创建sys_prewarm 扩展

    2、sys_prewarm 函数

    3、验证sys_prewarm 函数

    4、sys_extend 函数


    在金仓数据库KingbaseES中,sys_prewarm 扩展插件可以实现数据的cache。

    一、准备数据

    1. test=# create table prewarm_test1(id integer,name text);
    2. CREATE TABLE
    3. test=# insert into prewarm_test1 select generate_series(1,3000000),md5(random()::text);
    4. INSERT 0 3000000
    5. test=# select sys_size_pretty(sys_relation_size('prewarm_test1'));
    6. sys_size_pretty
    7. ----------------
    8. 195 MB
    9. (1 row)
    10. create table prewarm_test2 as select * from prewarm_test1;
    11. create index ind_prewarm_test2 on prewarm_test2(id);

    二、select 操作与 cache

    1、统计cache信息的脚本

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

    1. select c.relname, count(*) as buffers
    2. from sys_buffercache b
    3. inner join sys_class c on b.relfilenode = sys_relation_filenode(c.oid)
    4. and b.reldatabase in (0, (select oid from sys_database where datname = current_database()))
    5. group by c.relname
    6. order by 2 desc;

    2、全表访问

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

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

    1. relname | buffers
    2. -----------------------------------------+---------
    3. sys_attribute | 36
    4. sys_class | 25
    5. sys_proc | 13

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

    1. test=# select count(*) from prewarm_test1;
    2. count
    3. ---------
    4. 3000000
    5. (1 row)
    6. relname | buffers
    7. -----------------------------------------------+---------
    8. prewarm_test1 | 96
    9. sys_attribute | 36
    10. sys_class | 25

    再次 全表访问后的状态:

    1. test=# select count(*) from prewarm_test1;
    2. count
    3. ---------
    4. 3000000
    5. (1 row)
    6. relname | buffers
    7. -----------------------------------------------+---------
    8. prewarm_test1 | 192
    9. sys_attribute | 36
    10. sys_class | 25

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

    3、索引访问

    1. test=# end;
    2. test=# \set SQLTERM /
    3. test=# declare
    4. test-# v_temp integer;
    5. test-# begin
    6. test-# for i in 1..3000000 loop
    7. test-# select id into v_temp from prewarm_test2 where id=i;
    8. test-# end loop;
    9. test-# end;
    10. test-# /
    11. ANONYMOUS BLOCK
    12. relname | buffers
    13. -----------------------------------------+---------
    14. prewarm_test2 | 12287
    15. ind_prewarm_test2 | 4044
    16. sys_class | 25

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

    三、sys_prewarm 

    1、创建sys_prewarm 扩展

    1. test=# create extension sys_prewarm;
    2. CREATE EXTENSION
    3. test=# \dx+ sys_prewarm
    4. Objects in extension "sys_prewarm"
    5. Object description
    6. --------------------------------------------------------
    7. function autoprewarm_dump_now()
    8. function autoprewarm_start_worker()
    9. function sys_extend(regclass,bigint)
    10. function sys_prewarm(regclass,text,text,bigint,bigint)
    11. (4 rows)

    2、sys_prewarm 函数

    1. create function sys_prewarm(
    2. regclass,
    3. mode text default buffer,
    4. fork text default main,
    5. first_block int8 default null,
    6. last_block int8 default null
    7. )
    8. returns int8
    9. as module_pathname, sys_prewarm
    10. language c
    • regclass:要做prewarm的表名
    • mode:prewarm模式。prefetch表示异步预取到os cache;read表示同步预取;buffer表示同步读入shared buffer
    • fork:relation fork的类型。一般用main,其他类型有visibilitymap和fsm
    • first_block & last_block:开始和结束块号。表的first_block=0,last_block可通过sys_class的relpages字段获得
    • RETURNS int8:函数返回sys_prewarm处理的block数目(整型)

    3、验证sys_prewarm 函数

    1. test=# select sys_prewarm('prewarm_test1');
    2. sys_prewarm
    3. -------------
    4. 25000
    5. (1 row)
    6. relname | buffers
    7. -----------------------------------------------+---------
    8. prewarm_test1 | 16026
    9. sys_proc | 114
    10. sys_attribute | 36

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

    4、sys_extend 函数

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

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

    1. test=# select relname,relpages from sys_class where relname='prewarm_test1';
    2. relname | relpages
    3. ---------------+----------
    4. prewarm_test1 | 25000
    5. (1 row)
    6. test=# select sys_extend('prewarm_test1',10000);
    7. sys_extend
    8. ------------
    9. t
    10. (1 row)
    11. test=# analyze prewarm_test1;
    12. ANALYZE
    13. test=# select relname,relpages from sys_class where relname='prewarm_test1';
    14. relname | relpages
    15. ---------------+----------
    16. prewarm_test1 | 35000
    17. (1 row)

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

  • 相关阅读:
    ue5 lyra的角色动画系统 持续更新中。。。。
    使用pushd高效的切换目录
    【QT学习】扫描二维码获取登录验证码(完整源码)
    Linux搭建我的世界MC服务器 【Minecraft外网联机教程】
    点云入门知识
    技术公开课|深度剖析 Java 的依赖管理,快速生成项目 SBOM清单
    java.sql.SQLNonTransientConnectionException Public Key Retrieval is not allowed
    个微号的二次开发,api
    在Linux系统上检测GPU显存和使用情况
    数据批处理速度慢?不妨试试这个
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/127976493