openGauss之系统隐藏列

一. 前言

        openGauss在建表时,系统会自动插入tableoid,cmax,xmax,cmin,xmin,ctid 六个系统隐藏列,在select*的时候也会自动隐藏这6个系统隐藏列,如下所示:

       本文主要走读代码了解openGauss是如何实现系统隐藏列的功能的。

二.  create table时自动往表中插入系统隐藏列

​         create table时自动往表中插入系统隐藏列的核心代码入口在heap_create_with_catalog函数中,在往pg_attribute元数据表insert完普通的列后接着insert系统隐藏列的信息,代码流程如下所示:

heap_create_with_catalog
    AddNewAttributeTuples
        for (i = 0; i < natts; i++) {
            InsertPgAttributeTuple(rel, attr, indstate);  // 往PG_ATTRIBUTE系统表中插入表的普通字段
        }
        if (relkind != RELKIND_VIEW && relkind != RELKIND_COMPOSITE_TYPE && relkind != RELKIND_CONTQUERY) {
            for (i = 0; i < (int)lengthof(SysAtt); i++) {
                InsertPgAttributeTuple(rel, &attStruct, indstate);  往PG_ATTRIBUTE系统表中插入表的隐藏字段,也即xmin,xmax,cmin,cmax等字段,另外,系统隐藏列的AttributeNumber均为在代码中硬编码且均为小于0的负数,这也为区分是某一列是系统隐藏列还是普通列提供了区分的方式
            }
        }
三.  insert数据时自动往隐藏列insert数据

​      在insert数据的时候,系统的隐藏列的数据也要同时被insert进去,核心代码入口在heap_insert中,insert的场景主要是xmin的值比较重要。

heap_insert
    TransactionId xid = GetCurrentTransactionId();
    heaptup = heap_prepare_insert(relation, tup, cid, options);
        HeapTupleHeaderSetCmin(tup->t_data, cid);   // 设置cmin
        HeapTupleSetXmax(tup, 0);  // 设置xmax值,其实insert场景xmax值一直都是0
    RelationPutHeapTuple(relation, buffer, heaptup, xid);
        tuple->t_data->t_choice.t_heap.t_xmin = NormalTransactionIdToShort(pd_xid_base, xid) // 设置xmin,xmin其实就是xid的值,但元组中存储的其实是将xid与xid的差值
        (HeapTupleHeader)item)->t_ctid = tuple->t_self;  // 保存t_ctid
四. select *的时候自动忽略隐藏列的数据

​       seelct * 的时候自动屏蔽系统隐藏列是扫描pg_attribute获取表的列信息时自动添加过滤条件attnum > 0实现的,主要的实现入口在relation_open中,代码流程如下所示:

relation_open
    RelationIdGetRelation
        RelationBuildDesc
            RelationBuildTupleDesc
	             ScanKeyInit(&skey[1], Anum_pg_attribute_attnum, BTGreaterStrategyNumber, F_INT2GT, Int16GetDatum(0));  // 只扫描attnum大于0的列,因为隐藏列的attnum都小于0但真正的物理表的列大于0,因此扫描表的列信息时自动将系统隐藏列忽略
	             pg_attribute_scan = systable_beginscan(...skey...)
	             while (HeapTupleIsValid(pg_attribute_tuple = systable_getnext(pg_attribute_scan))) {
	                 memcpy_s(&relation->rd_att->attrs[attp->attnum - 1]...attp...)  // 保存列信息到relation中
	             }
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于openGauss系统是指在openGauss数据库基础上构建的应用系统openGauss是一款国产化的数据库系统,它兼容传统数据库的SQL方言,并且在开发者生态方面不断完善。在国产化操作系统(如麒麟操作系统、鲲鹏欧拉操作系统)上运行openGauss数据库,可以实现系统的高效稳定运行,并且能够充分发挥国产化数据库的优势。 基于openGauss系统可以通过以下步骤进行构建和部署: 1. 安装openGauss数据库:根据openGauss的安装指南,在操作系统上安装openGauss数据库。 2. 创建数据库:使用openGauss提供的命令或图形界面工具,创建一个新的数据库实例。 3. 设计数据模型:根据应用系统的需求,设计数据库的表结构和关系模型。 4. 开发应用程序:使用编程语言(如Java、Python等)开发应用程序,连接到openGauss数据库,并实现对数据库的增删改查操作。 5. 部署应用程序:将开发好的应用程序部署到服务器上,确保应用程序能够与openGauss数据库进行通信。 6. 测试和优化:对基于openGauss系统进行测试,发现并修复潜在的问题,并对系统进行性能优化,以提高系统的响应速度和稳定性。 7. 上线运行:将经过测试和优化的基于openGauss系统部署到生产环境中,让用户可以正常使用系统。 通过以上步骤,可以构建一个基于openGauss系统,实现对数据的存储、管理和查询等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值