如何从零学习PostgreSQL Page结构

  • 时间:
  • 浏览:1

亲戚亲戚亲戚亲戚朋友删除一行tuple可不不需要 看得人prune_xid有了值,为559,这名 559不多不多删除这名 tuple的事务id(当前最早的删除或更改了tuple的事务id)



同样,亲戚亲戚亲戚亲戚朋友可不不需要 看得人lp为1的这名 tuple的t_xmax为559,这里不多不多删除这行tuple的事务id。

可不不需要 看得人第0个page的pd_lsn为0/1671188,checksum和flags全是0,这里这麼开启checksum;tuple结束英语 偏移是772(pd_lower),结束英语 偏移是784(pd_upper),这名 page是个表,不多不多它这麼special,亲戚亲戚亲戚亲戚朋友看得人的sepcial不多不多8192了;pagesize是8192不多不多8K,version是4,这麼不需要 清理的tuple,不多不多存储不需要 清理的tuple的最早事务的id不多不多0(prune_xid)。

page_header 可不不需要 看得人页头的数据

heap_pageitems 可不不需要 看得人具体tuple的数据

2.1 page社会形态

t_infomask2 表示属性和标志位

PostgreSQL Page的物理社会形态相比Oracle的数据块来说简单不多不多了,源代码开放也便于学习和研究,pg是个很好很强大的数据库,值得好好学习。

3.3 Pageinspect查看page

它在源码的crontrib目录下面

三、实验

3.2 创建建测试表t1,插入数据



这可不不需要 否看得人800行数据用了6个数据块来存储(这里数据块从0结束英语 ),第6个数据块蕴藏了73条记录(tuple)

导读:PostgreSQL 号称是“世界上最先进的开源数据库”(The world's most advanced open source database),在DB-Engines的排名中长期指在第四的位置,因此增长趋势明显。开源的优势不多不多可不不需要 直接阅读源码,本文通过源码结合pageinspect对pg的page社会形态进行解析和学习。

3.4 删除一行数据观察prune_xid

2.3 linp社会形态(行指针)



lp_off是tuple的结束英语 的偏移量;lp_flags是标志位;lp_len记录了tuple的长度。



2.4 tuple header社会形态(行头)

页头HeapTupleHeaderData蕴藏了union社会形态体中的有三个小 变量HeapTupleFields和DatumTupleFields。t_ctid是tuple id,例如oracle的rowid,形式为(块号,行号)。

在DatumTupleFields中,datum_len_ 指tuple的长度;datum_typmod是记录的type;datum_typeid是记录的id。

二、Page的外部社会形态

pg中的page和Oracle中的数据块一样,指的是数据库的块,操作系统块的整数倍个,默认是8K而是多不多不多不多三个小 操作系统块(4k的文件系统块)。这名 大小在pg编译安装configure的从前通过--with-blocksize参数指定,单位是Kb。

可不不需要 看得人有三个小 Page有 Pager header(页头),顶端是linp(行指针),pd_lower和pd_upper分别是空闲空间的结束英语 位置和结束英语 位置;顶端不多不多行数据(pg顶端的行不多不多tuple)和special空间。整个page的社会形态比Oracle的数据块社会形态简单多了。

t_hoff表示tuple header的长度

pd_flags有以下的值:

全是对应的长度和描述的相完整性说明:



union是共享社会形态体,起作用的变量是最后一次赋值的成员。来看看tuple header的社会形态。

具体的长度和描述也全是完整性说明:



简单来说,pd_lsn是指最后修改过这名 page的lsn(log sequence number),这名 和wal(write ahead log,同oracle redo)中记录的lsn一致。数据落盘时redo不需要 先刷到wal,这名 pd_lsn就记录了最后data落盘时的相关redo的lsn。

在HeapTupleFields中,t_xmin是插入这行tuple的事务id;t_xmax是删除不可能 锁住tuple的事务id;union社会形态中的t_cid是删除不可能 插入这名 tuple的命令id,而是多不多命令序号;t_xvac是从前格式的vacuum full用到的事务id。

t_bits记录了tuple中null值的列

pd_lower和pd_upper分别表示空闲空间起始位置和结束英语 位置;pd_special在索引page才有效;pd_pagesize_version是page大小和page version的存储位,在不同数据库版本中,page version不一样:

3.3.1 page_header

3.3.2 heap_page_items



亲戚亲戚亲戚亲戚朋友来看一行记录,可不不需要 看得人它是第1行记录(lp=1),tuple的结束英语 偏移量8180(lp_off),tuple的长度是32 bytes(lp_len为32,这名 tuple是第有三个小 插入的tuple,不多不多lp_off+lp_len=8180+32=8192),这行记录的插入事务id是557(t_min),和tuple的删除事务id是0(tmax),这里数据这麼被删除,不多不多全是0。亲戚亲戚亲戚亲戚朋友还可不不需要 看得人t_ctid是(0,1),这里表示这名 tuple是这名 page中第有三个小 块的第第根小tuple;tinfomask2是2,t_infomask为2806,十六进制不多不多 0x0902 ,这名 亲戚亲戚亲戚亲戚朋友可不不需要 根据顶端提到的值去看看具体的含义,0x0902 = 0x080 + 0x0800 +0x0002;tuple头部社会形态(行头)的长度是24(t_hoff),t_data不多不多16进制存储的真正的数据了。

原文发布时间为:2018-12-9

本文作者: 李亮

本文来自云栖社区企业商务合作伙伴“ 数据和云”,了解相关信息可不不需要 关注“OraNews”微信公众号

t_infomask 是flag标志位,具体值如下:

3.1 安装pageinspect



2.2 PageHeaderData数据社会形态 (页头)

一、Page



prune_xid表示这名 page上最早删除不可能 修改tuple的事务id,在vacuum操作的从后后用到。(pg这麼undo,旧的数据也在page中,用vacuum来清理)

pd_checksum是校验和,在initdb初始化实例的从前通过-k参数指定开启,默认是关闭的,initdb从前只有修改,它基于FNV-1a hash算法,做了相应的更改。这名 校验和与Oracle的checksum一样用于数据块在读入和写出内存时的校验。比如亲戚亲戚亲戚亲戚朋友在内存中修改了有三个小 数据块,写入到磁盘的从前,在内存顶端先计算好checksum,数据块写从前再计算一遍cheksum否有和从前在内存中的一致,确保整个写出过程这麼出错,保护数据社会形态不被破坏。

这里亲戚亲戚亲戚亲戚朋友通过有三个小 函数来查看