PostgreSQL系统隐藏字段

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 概述在PostgreSQL数据库中,每个表都会有几个系统字段,这些字段是由系统隐含定义的。正常情况下是不对用户进行显示的。但是也可以查看到。通过了解这些隐藏字段。对pg的体系架构了解更深一步oid对象标识符,是各种系统表的主键。

概述

在PostgreSQL数据库中,每个表都会有几个系统字段,这些字段是由系统隐含定义的。正常情况下是不对用户进行显示的。但是也可以查看到。通过了解这些隐藏字段。对pg的体系架构了解更深一步

oid

对象标识符,是各种系统表的主键。是一个四字节的无符号的整数
系统不会给用户创建的表增加一个oid字段,但是可以使用‘with oids’选项为表增加oid字段。另外,表中的oid生成的序列值为全局的。并不是从1开始的。如下

postgres=# create table test03 (id int) with oids;
CREATE TABLE
postgres=# insert into test03 values (1);
INSERT 16458 1
postgres=# insert into test03 values (2);
INSERT 16459 1

postgres=# select oid,id from test03 ;
  oid | id 
-------+----
 16458 | 1
 16459 | 2
(2 rows)

数据库,表,索引,视图等,都有一个oid标志符,

数据库
postgres=# select oid,datname from pg_database;
  oid | datname  
-------+-----------
 13878 | postgres
 16384 | stephen
     1 | template1
 13877 | template0

表或索引
postgres=# select oid,relname from pg_class where relname ~ 'test';
  oid | relname   
-------+-------------
 16398 | test01
 16447 | test02
 16453 | test02_pkey
 16455 | test03
 16401 | test_view

postgresql 的数据文件存储,就是通过oid进行的,在默认表空间下,存储的数据目录,就是对应的数据库的oid

[root@stephen pgdata]# ls base/
1 13877 13878 16384
[root@stephen pgdata]# ls base/16384/
112 13723_vm 16411 2601 2610 2620_vm 2679 2756 3079_fsm 3440 3598_vm 3997

xtid

ctid表示数据行的在它所处的表内的物理位置。ctid字段的类型是是tid。尽管tid可以非常快的定位数据行。但是每次vacuum full之后。数据行在块内的物理位置会移动。即ctid会发生变化。所以ctid不能长期作为行标识符

postgres=# select ctid,* from test02;
 ctid | id | name  
-------+----+-------
 (0,1) | 1 | dasda
 (0,3) | 2 | ceshi
(2 rows)

由上面可以看到,ctid由两个数字组成,第一个数字表示物理块号,第二个数字表示在物理块中的行数

xmin、xmax、cmin、cmax

这四个字段在mvcc中实现的中用于控制数据行是否对用户可见,PG会将修改前后的数据都存储在相同的结构中,分以下几种情况

  • 新插入一行时:将新插入的行的xmin填写为当前事务的事务ID,xmax填0
  • 修改某一行时:实际上是先插入一行,旧的行上的xmin不变,旧行上的xmax改为当前事务的id,新的行上的xmin填写为当前事务ID,xmax填写为0
  • 删除一行时:把被删除行上的xmax填写当前事务的ID

换句话说,xmin就是标记插入数据行的事务ID,而xmax就是标记删除数据行的事务ID

postgres=# select xmin,xmax,cmin,cmax,id,name from test02;
 xmin | xmax | cmin | cmax | id | name   
------+------+------+------+----+----------
  648 | 0 | 0 | 0 | 1 | dasda
  649 | 0 | 0 | 0 | 2 | dasdasda
(2 rows)
postgres=# update test02 set name = 'ceshi' where id =2;
UPDATE 1
postgres=# select xmin,xmax,cmin,cmax,id,name from test02;
 xmin | xmax | cmin | cmax | id | name  
------+------+------+------+----+-------
  648 | 0 | 0 | 0 | 1 | dasda
  651 | 0 | 0 | 0 | 2 | ceshi
(2 rows)

cmin和cmax用于判断同一个事务内的不同命令导致行版本变化的是否可见,如果一个事务内的所有命令都是严格按照顺序执行的,那么每个命令都能看到之前该事务内的所有变更。但是在一般的编程中数组或列表遍历时,就有可能会导致出现逻辑错误。所以需要这个隐藏字段来控制

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
关系型数据库 MySQL 索引
MySQL数据表添加字段的三种方式
MySQL数据表添加字段的三种方式
1276 0
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
19天前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
26 8
|
4月前
|
分布式计算 DataWorks MaxCompute
DataWorks产品使用合集之需要将mysql 表(有longtext类型字段) 迁移到odps,但odps好像没有对应的类型支持,该怎么办
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之写doris,mysql字段变更,重新提交才能同步新字段数据吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
23天前
|
SQL 关系型数据库 MySQL
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
MySQL根据某个字段包含某个字符串或者字段的长度情况更新另一个字段的值,如何写sql
51 0
|
2月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
50 0
|
3月前
|
关系型数据库 MySQL 数据库
MySQL 保姆级教程(八):创建计算字段
MySQL 保姆级教程(八):创建计算字段
|
3月前
|
关系型数据库 MySQL
mysql使用 CONCAT(字段,字段) 函数拼接
mysql使用 CONCAT(字段,字段) 函数拼接
|
3月前
|
存储 SQL 缓存
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
下一篇
无影云桌面