开发者社区> 云平_Stephen> 正文

PostgreSQL系统隐藏字段

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
mysql 系统用户最大文件打开数限制
mysql 系统用户最大文件打开数限制 纸上得来终觉浅,绝知此事多宕机...记录一下自己很蠢的一次故障处理过程。   上周的时候,一个刚上线的系统又开始反映登不上了,因为最近这个系统也老是出现这个问题,开发也一直在找问题中,所以也没太在意。
1032 0
SQL2000系统表、存储过程、函数的功能介绍及应用
转自:http://blog.csdn.net/zlp321002/article/details/480925 ----系统表---------------------------------------------------------------------------------------------------- 虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。
671 0
Azure云部署Postfix邮件系统(一)
简介 毫无疑问,云计算是今年和今后几年IT界最重要的概念之一,而随着云的提出,各种应用也不断出现,在云计算领域,各大著名IT厂商都推出自己的特有“云”。在一个新技术的探索阶段,在云计算的模式最终成熟之前,任何一方任何一家厂商甚至是个人开发者都有权利来解释它将来的云计算的模样。
2379 0
Django Rest Framework动态获取字段
项目名称 drf-dynamic-fields 项目描述 提供了一个mixin,用于serializer,实现动态配置返回字段的效果。在获取数据的API的时候,在URL中加入一个查询字段fields,用来过滤返回数据的字段,减少网络传输的数据。
1399 0
如何通过SQL Server执行系统命令?
本文讲的是如何通过SQL Server执行系统命令?,渗透测试过程中,大家经常会碰到通过MSSQL来进行提权或执行系统命令之类的操作,通常我们经常会使用xp_cmdshell来进行执行系统命令,但是当xp_cmdshell不能使用的时候,我们还有什么别的方式么?本文将介绍与分享一下我自己学到的一些姿势。
3015 0
+关注
云平_Stephen
一个DBA
30
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载