POSTGRESQL 底层存储原理探索

要想使用一种数据库,一般有两种方法,不懂先从底层的知识来,通过以前学到的数据库的知识对比,新数据库的底层知识,快速了解这种数据库,另外是从操作入手,不管底层知识,直接操作,从操作中体会新数据库和以前接触过的数据库之间的差异。

一般我比较喜欢第一种,今天就来搞一搞 POSTGRES QL 的底层存储知识。

1 从对比来看POSTGRESQL 的数据库(非INSTANCE 那个级别的数据库),SQL SERVER 的DBA 可以和理解 SQL SERVER 对INSTANCE 和数据库的概念一样,不需要费劲,MYSQL 的DBA 也是一样。 ORACLE的DBA 需要理解,这里的数据库就是ORACLE中一堆同样用户下的表的集合,叫数据库。非INSTANCE的那个概念。

下图就是一个POSTGRES QL INSTANCE 中包含的数据库,有一些事自建的,有些是系统的数据库, oid是每个数据库的OBJECT_ID,这点很类似SQL SERVER 中每个对象都有一个OBJECT_ID。

创建一个表company, 这里展示他的表结构,通过查询COMPANY的表结构,发现查询语句的写法的确和PL/SQL 类似,看来SQL SERVER 和MYSQL 在处理表关联是一路的, ORACLE 和 POSTGRES QL 在写表关联是一个思路。

那这个表的实体文件到底存在哪里,

一般一个表会有三个文件,表的数据文件, _FSM _VM 三个文件,组成,FSM 和 VM 和表的数据页面管理,以及数据清除有关。

POSTGRES QL 对用户是比较友好的,例如你要查当前库中的COMPANY表的一些信息,这是其他数据库都做的不足到的。

POSTGRES QL 仅仅需要输入 \dt company,直接将结果就输出了

相对其他数据库要简单的快速方便的多。

通常POSTGRESQL 中每个表是存储在多个固定的 8KB的页面中的,表存储在HEAP的文件中,并且由于页面的组织方式和 ORACLE 有些相似,通过item 指向 数据块的方式,下图画的比较粗糙,实际上POSTGRESQL在每个页面中的设计是很巧妙的。


通过相关函数(POSTGRESQL 默认不按照,自己源码编译,此处不再介绍安装过程)

通过上面的命令我们可以分析POSTGRESQL 的页面基本信息

如果我们想知道这个页面到底有多少空间还可以使用, 使用 UPPER - LOWER 就可以得到我们剩下的空间,并且头部占用  24B 每个 ITEM 占用 4B,由于元祖(data)的长度并非完全一致,所以这里面通过 alignmentpadding 来补齐元祖,提高I/O的性能,一般64位的机器的长度为8K

下面我们继续分析,POSTGRESQL 中的元祖信息(DATA),通过下图

我们可以看到,每一个数据行对应的CTID 和 每一行占用的PAGE中的大小

(SQL SERVER 里面也有类似的函数可以查看,并且一眼就可以看出和 ORACLE, POSTGRESQL 之间的数据页面的组织不同)

大致一行的数据是上面图组成的(画的还是不仔细t-min  t-max 少X 应为 t-xmin  t-xmax ,见谅)


主要元祖的创建transaction 号 T-XMIN

       元祖的删除transaction 号 T-XMAX

       CTID 

        t_hoff 数据偏移量

        data    数据组成

未来验证上面的行结构,新建一个表 varchar(8000) ,并且大量输入字符,见下面的图,大家可以很清楚的查看,页中的truple(元祖的)偏移量和占用的空间

POSTGRES QL ,在数据存储底层设计上,和ORACLE 基本相似,并且也是堆表进行数据的存储,这在很大一方面验证了,这样的底层设计有利于大数据的处理,也验证了部分最近很大一部分机构和企业的在 ORACLE 转型中,选择POSTGRES QL 来代替 ORACLE 数据库的可行性。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值