postgresql中如何新增加一个SysCache

PG数据库源码-SysCache部分匹配机制 PG数据库源码阅读-SysCache和CatCache的匹配机制 阅读详情

如何增加一个SysCache

如果你阅读过Postgres源码,就肯定会看到这样的用法:GetSysCacheOid1,SearchSysCache1之类的,望文生义,显然是通过系统缓存查找某些东西,如果一些常用的数据存放在内存中,肯定能极大的提高查找效率。

SysCache中缓存的是什么东西?

    元数据,也就是系统表中数据。经常会用到的系统表,都有会缓存起来,提高性能,是不是每个系统表都有cache没仔细核查过。例如pg_class表中数据,第一次查某表,需求从磁盘上加载,第二次就直接从syscache中找到,但这只是表的属性信息,并非表的内容,如select *fromt1;  从t1这个名字找oid的过程可以从cache中找到,但t1的内容不行,t1在内容在另外的buffer中,而且该内容的share_buf是全局的,而元数据的cache是局部的。

    另外,syscahce中缓存的对象单位是tupple,或者说叫元组,通俗点说就是行,按行缓存,对普通表内容是按页缓存在buf中。

SysCache是怎么找的?

    来看一个例子:

Select *from t1;

内部会通过t1从Search_path找Schema name 去一起找这个表所在oid,有这oid才能找到表数据,找这个oid就会用到syscache,会走到如下接口:

Oid

get_relname_relid(constchar *relname, Oid relnamespace)    //通过schema + name找oid

{

    return GetSysCacheOid2(RELNAMENSP,

                           PointerGetDatum(relname),

                           ObjectIdGetDatum(relnamespace));

}

然后会进入下面函数:

Oid

GetSysCacheOid(intcacheId,    //对应上面的 RELNAMENSP

              Datum key1,    //对面上面的relname

              Datum key2,   //对面上面的relnamespace

              Datum key3,

              Datum key4)

{

    HeapTuple   tuple;

    Oid         result;

 

    tuple = SearchSysCache(cacheId, key1, key2, key3,key4);   //从cache中找到tuple

    if (!HeapTupleIsValid(tuple))

        return InvalidOid;

    result = HeapTupleGetOid(tuple);           //取出元组中oid即可

    ReleaseSysCache(tuple);

    return result;

}

 

对于一个表来说,如果确定了模式名和表名,那显然能唯一确定一个表,对上面函数来说,RELNAMENSP已经确定了是从哪个系统表中找,并且也确定了唯一索引是什么,这个唯一索引有两个索引键,是relname和relnamespace,那么就能根据它们找出一个唯一tuple出来。

SearchCatCache函数逻辑相对复杂,不过多深入,大致流程介绍下:首先会按hash的方式去cache中找,通过hash计算出一个位置,因为hash算法不是唯一的,所以找到的是一个链表,然后遍历这个链表找到最终值,如果要缓存的元组相对较多,建议桶多搞点,毕竟现在memory is cheap,空间换时间合算。能找到并且没有失效就返回,找不到则打开系统表去找,找到后挂到cache上并返回,下次可直接找到。这里的链表是一个有意思的结构,存的并不是直接的tuple数据,而是一个包含有这个tuple数据的一个CatCTup对象的另外一个成员的地址。CatCTup也是一个有趣的结构,内部的 CT_MAGIC宏很魔幻。

如何增加一个SysCache?

四个要点:

1.   在SysCacheIdentifier中增加一个枚举值

2.   在cacheinfo数组增加一个元素

3.   在indexing.h中增加一个唯一索引

4.   在修改元组的地方更新。

实例分析:

下面以一个postgres10的分区增加的syscache作为具体的例子来详细介绍各个细节。

对于分区系统表pg_partitioned_table,在SysCacheIdentifier增加了枚举PARTRELID,注意它的位置,是排序的,名字自己取,注意望文生义即可。

在cacheinfo数组中,增加了元素

{PartitionedRelationId,    /* PARTRELID */

        PartitionedRelidIndexId,

        1,

        {

            Anum_pg_partitioned_table_partrelid,

            0,

            0,

            0

        },

        32

    },

其中PartitionedRelationId 为要缓存的表oid, PartitionedRelidIndexId为要缓存的表上对应的唯一索引oid,1为前面的索引的索引键个数,下面的Anum_pg_partitioned_table_partrelid为对应的索引键为表中哪列,最多4个,再下面的32为hash桶个数,如果要缓存的元组多,不妨把这个桶个数设大点,提高效率。注意,这里在cacheinfo中新加的元素位置必须和SysCacheIdentifier中加的枚举位置相同,因为使用时就是以枚举作为数组下标引用。

indexing.h中的索引为PartitionedRelidIndexId,定义如下:

DECLARE_UNIQUE_INDEX(pg_partitioned_table_partrelid_index,3351, onpg_partitioned_table usingbtree(partrelid oid_ops));

#define PartitionedRelidIndexId          3351

也就是说,这是只有一个索引键的唯一索引,对应的列为partrelid列。

对于最后一步,在修改的地方更新cache,则在以下接口中有体现:

StorePartitionKey 函数,插入元组后,会调用CatalogUpdateIndexes更新,而对于删除元组,在RemovePartitionKeyByRelId中,删除之后会ReleaseSysCache 更新。

如果我们要增加一个cache,完成以上步骤即可。

补充一点

         可能有你看到了,上面有几个字描红加大并且加粗了:没有失效,对于cache这是一个非常关键的点。假如有这样的场景:A会话中select 表t1,那么会加到cache中,B 会话中把这个表drop掉,再从A会话select这个表。显然,是查不到这个表,因为这个cache会失效。当有某个连接中有更新事务提交后,当前所有活跃连接在事务开始时以及语句开始时(注意,begin事务中每个语句开始时),都会主动去接收一个全局共享的消息队列,把一些其它连接中发生改变的对象对应的本地cache进行更新删除,再找时需要重新去表上找,cache中将不存在,保证一致性。

postgreSQL中的高速缓存 ​如下图所示,当一个postgreSQL进程读取一个元组时,需要获取表的基本信息(例如:表的oid、索引信息和统计信息等)及元组的模式信息,这些信息被分别记录在多个系统表中。通常一个表的模式信息在设定好后的变化频率很低,因此在对同一个表的多个元组操作时,每次都去读取系统表的元组来构建模式信息显然是没有必要的,这也会降低元组的操作效率。为了减少对系统表的访问,在每个进程的本地内存区。 阅读详情

相关推荐

PostgreSQL 核心原理:系统内部的对象寻址机制(OID 对象标识符)

PostgreSQL 中的 OID(对象标识符)是系统内部用于唯一标识数据库对象的32位无符号整数,在现代版本中已逐步从用户表退居幕后,但仍作为系统表间的"外键"纽带支撑着元数据管理。本文从五个维度剖析OID:1)历史演进:从早期用户表默认包含到8.0版默认禁用,直至12版完全移除;2)内部结构:作为系统目录主键、类型系统核心和函数标识;3)分配机制:通过全局计数器nextOid实现集群级分配;4)安全风险:因信息泄露和复制冲突等问题被弃用;5)替代方案:推荐使用SERIAL/UUID作

数据知道的博客 2355

Postgresql的pageinspect插件框架与数据恢复探索

1 插件代码分析 pageinspect是一个非常典型、简单的插件,大部分流程可以学习、复用。 如果需要写新的插件,可以直接copy修改下面两个函数,大部分框架代码可以直接使用。 get_raw_page读取页面的经典流程 get_raw_page只返回一行数据,所以无需走插件循环产生元组的流程。 读取页面的经典流程: 1、schema+table名包装:makeRangeVarFromNameList 2、打开表:relation_openrv 3、读页面(返回pin住的页面):ReadBufferExt

InternalsOf 1770

AutoDL跑yolo

由于博主在AutoDL的JupyterLab的终端直接上传ZIp文件要么老是再上传中被中断,要么就是上传后使用unzip指令解压显示“找不到”,作为纯小白的我实在太难了!这个文件列出了一个 Python 项目所需的所有依赖包及其精确的版本号。这个文件是 Python 项目中常见的一种方式,用于确保项目在不同环境中都能以相同的依赖包配置运行。3.进入JupyterLab,在文件夹目录中找到上传的文件夹,右键点击“复制路径”。然后在终端中输入以下指令进行切换到该文件夹路径。9.安装成功后开始输入指令开跑!

m0_73804659的博客 1206

postgreSQL源码分析——存储管理——内存管理(3)

2021SC@SDUSC 概述 源码分析 总结

weixin_45644897的博客 2278

保姆级教程:在CentOS 8上用libvirt + QEMU/KVM搭建ARM64虚拟机(含UEFI配置与常见坑点)

本文提供在CentOS 8上使用libvirt + QEMU/KVM搭建ARM64虚拟机的详细教程,涵盖UEFI配置与常见问题解决方案。通过环境准备、特殊配置要点、UEFI固件安装等步骤,帮助用户在x86架构服务器上高效运行ARM64虚拟化环境,特别适合开发测试与跨平台应用场景。

weixin_30292745的博客 133

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7692

Postgresql源码(136)syscache/relcache 缓存及失效机制

syscache/relcache 缓存及失效机制

InternalsOf 2205

基于Autoware制作高精地图(一)

基于Autoware制作高精地图(一) ​开始进入正题,也是最近在忙的一件事,制作高精地图。 高精地图的制作大概分为以下四个流程(不一定完全正确): 1.构建点云地图; 2.点云地图标注; 3.制作OpenDrive地图; 4.地图存储索引。 这篇文章主要讲解如何构建点云地图。 首先我们要有一段自己录制的激光雷达点云数据,这里推荐大家采用Velodyne16线激光雷达,因为这里我们构建的点云底图是三维的,而采用Velodyne而不是速腾聚创(rslidar)等其他品牌的原因是Autoware里面有一个选项是

weixin_44570248的博客 7800

Postgresql源码(45)SysCache内存结构与搜索流程分析

1 内存结构和查询步骤 查询步骤概要 使用SysCacheIdentifier在CatCache数组中找到对应的CatCache 计算hash,按数组index找到bucket 找到bucket后,在bucket双向链表中遍历找到CatCTup,元组记录在其中;找到后调整到双向链表头(LRU) 多条查询步骤概要 cc_lists用与多条数据查询 计算hash,按顺序匹配每个catclist,找到catclist 如果List可用直接返回。注意catclist中再结构体后面记录了该List指向的所有Ca

InternalsOf 1430

大模型越狱指令数据集全解析:从AdvBench到HarmBench

本文全面解析了AdvBench、HarmBench等主流大模型越狱指令数据集。AdvBench作为基础测试集,用于快速评估模型安全基线;HarmBench则以其全面的文本、多模态及对抗性攻击评估,成为当前权威的深度安全审计工具。文章还介绍了MaliciousInstruct、JailbreakBench等特色数据集,并提供了根据实际场景选择与使用这些数据集的具体实战指南。

weixin_29327525的博客 621

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 543

PostgreSQL SysCache & RelCache

根据opername从pg_operator获取记录,并放到SysCache中。代码2 CatalogCacheInitializeCache。代码4:RelationIdGetRelation。代码5: RelationBuildDesc。代码3 table_open。

风的专栏 387

使用 STM32F7 和 TensorFlow Lite 开发低功耗人脸识别设备

我们讨论了 STM32F7 的特点和能力,TensorFlow Lite 在 STM32F7 上的应用,以及一些降低功耗的优化技术。- 准备模型:选择合适的人脸识别模型,在 TensorFlow 中进行训练和导出,并使用 TensorFlow Lite 转换为适用于 STM32F7 的量化模型。请注意,上述代码仅展示了如何加载和运行 TensorFlow Lite 模型的方法,实际应用中需要集成人脸检测和识别模型,并根据实际需求进行相应的输入和输出处理。结合这两个工具,我们可以开发出低功耗的人脸识别设备。

weixin_66608063的博客 2589

Greenplum SysCache and RelCache

1.AbstractWhen accessing database tables, some information needs to be obtained from system tables. In order to improve retrieval efficiency, PostgreSQL provides caches, including SysCache and RelCach...

Francis的博客 240

高通 vs MTK vs 海思:三大平台 ISP 架构横向对比与实战差异分析

随着移动影像能力成为智能终端差异化竞争的核心维度,ISP(Image Signal Processor)架构日益重要。高通、MTK、海思三大 SoC 厂商在 ISP 设计上各具特色,不仅在图像处理链路、模块集成度、算法加速路径等方面存在显著差异,同时也决定了终端厂商在成像质量、调试复杂度与扩展能力上的实际表现。本文将基于真实平台项目经验,横向对比三大主流平台的 ISP 架构关键指标,系统分析其在实际开发过程中的能力边界、工程成本与调优空间,帮助工程师更精准地进行平台选型与优化策略制定。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3938

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

postgresql中的relcache和syscache --todo

todo。

weixin_41685257的博客 275

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PostgreSQL 系统表相关技术栈 实现原理(系统表初始化&关系模型,SysCache & RelCache)

PG 系统表相关技术体系 实现分析

天行健,地势坤 4553

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Postgresql数据库新增一张系统表

在catalog 的makefile 中添加相应的系统表头文件 ./src/backend/catalog/Makefile:42: pg_foreign_table.h pg_partition_key.h \ 建表 – 以pg_partition_key为例,给该表添加代码pg_partition_key.h 在include的 catalog目录下添加这张表的定义 CATALOG宏定义为#define CATALOG(name,oid,oidmacro) typedef struct CppC

肥叔菌的博客 1986

postgresql 18.6 修改源代码,增加类似oracle那样的可以随意修改的view定义的功能

Oracle Package 的核心在于:将状态(包变量)、类型定义(Package Types) 和 代码(公有/私有存储过程与函数) 封装在一个独立的命名空间内,并分为包头(Specification)和包体(Body)。一旦视图被其他视图或视图触发器引用,你想直接通过 ALTER 去随意缩减列或改类型,系统会直接抛出“存在依赖关系”的致命错误(Error),逼着你必须使用 DROP ... CASCADE 把上层所有的依赖连根拔起全部删掉,才能修改底层视图。如果编译通过了,用户完全感知不到;

st780206的专栏 241

PostgreSQL 技术日报 (4月7日)|内核开发新动态,多项功能优化落地

讨论集中在完善PostgreSQL自定义OAuth验证器选项的补丁上。Zsolt Parragi审查了补丁,没有发现重大问题,只建议对测试代码进行外观改进,将GetOAuthHBAOption调用缓存到局部变量中以避免重复调用。Jacob Champion回应说他正准备尽快提交补丁。他澄清测试代码是有意设计来验证对GetOAuthHBAOption的多次调用能正常工作,而不是作为最佳实践的示例代码。Champion指出如果需要可编译的示例代码,会与测试实现有所不同。补丁看起来已准备好以当前方式提交。

IvorySQL的博客 362

PostgreSQL 监控 - 高频指标

PostgreSQL 实时健康监控 大屏 - 高频指标 - 珍藏级 作者 digoal 日期 2018-06-13 标签 PostgreSQL , 大屏指标 , qps , long query , locks , active , idle in transaction , long idle in transaction , 2PC 背景 最关键的一些数据库健康指标,趋势监测。...

Hehuyi_In的博客 5834

PostgreSQL 常用监控指标

QPS指标来自pg_stat_statements,由于这个插件有一个STATEMENT采集上限,可配置,例如最多采集1000条SQL,如果有新的SQL被采集到时,并且1000已用完,则会踢掉最老的SQL。当前系统中在事务中并且处于空闲状态的会话有多少,很多,说明业务端的处理可能比较慢,如果结合锁等待发现有大量锁等待,并且活跃会话数有突增,可能需要关注并排查业务逻辑的问题。同时需要注意,由于pg_stat_statements跟踪的SQL有限,最近未访问过的SQL的跟踪信息可能被抛弃。

不积跬步,无以至千里;不积小流,无以成江海。 4061

postgresql flush buffer

to clear the shared buffers, we do not have any predefined utility except instanceshutdown. So let’s shut down the PostgreSQL cluster to clear the database cache: $ pg_ctl -D data stop -mf waiting for server to shut down… done server stopped 4. To clear th

weixin_43230594的博客 750

PostgreSQL笔记27: 双缓存架构下的内存管理与性能观测实践

PostgreSQL采用双缓存架构,同时使用共享缓冲区(shared_buffers)和操作系统页缓存(OS Page Cache)来提高查询性能。文章分析了其内存管理机制,包括Linux内核的水位线回收策略和直接内存回收对性能的影响。同时介绍了PostgreSQL的私有缓存SysCache和RelCache的特性,以及相关观测工具如pg_buffercache和pg_prewarm的使用方法。最后给出了shared_buffers的配置建议,通常设置为总内存的25%-40%,并需要权衡双缓存架构带来的性能

Wang的专栏 285

postgresql源码(一)——psql命令

postgesql的源码都已经百万级了。单单.c文件都有1000+。怎么办,硬着头皮看吧,所幸postgrsql的源码很规范,这应该会给我省不少事。给自己顶一个小目标:每天看一点源码,每天都更新做不到,每周都更新吧,每周至少一篇。希望看到我的博客的朋友们也和我一起学习,我有什么理解不对的地方,也希望大家提出意见~ 大部分人初次接触postgresql一般都是接触psql这个命令行工具吧,那么我们今天就从psql程序的源码开始看吧。 psql的源码分为两部分,一部分是psql的前台处理代码,...

driftingman的专栏 995

Postgresql在哪里使用列统计信息?

对pg_statistic表的查询都是走syscache的,要找到所有使用列统计信息地方,遍历系统表索引即可。

InternalsOf 421
上一篇: PG_dump 源码笔记
下一篇: Postgresql MVCC机制源码初探
postgres20
博客等级 码龄10年 100粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值