zoukankan      html  css  js  c++  java
  • Postgres中表和元组的组织方式

    PG version 9.5.3

    PG中四种堆文件:

    • 普通堆
    • 临时堆
    • 序列堆
    • TOAST表

    PageHeaderData长度为24(截图为8.4版本,20字节)个字节包含的内容如下:

    • 空闲空间的起始和结束位置
    • Special space的开始位置
    • 项指针开始的位置
    • 标志信息,是否存在空闲指针,是否所以元组可见

    LinpItemIdData类型的数组

    Lp_off是元组在文件中的偏移量

    Lp_flags是元组的状态

    Lp_len是元组的长度

    Freespace是值未分配的空间,新插入的元组和对应的linp都会从这部分空间来分配

    linp从freespace的头开始分配,新的元组从尾部开始分配

    Special space

    特殊的空间,主要是用来存储跟索引方法相关的数据,不同的索引方法在special space

    存放的不同的数据。

    TUPLE

    元组中不单单存储元组数据还存储了元组的头数据(HeapTupleHeaderData)

    1. t_choice具有2个成员的联合类型:
      • T_heap 用于记录对元组执行插入/删除操作事物ID和命令ID,这些信息主要用于并发

          控制是检查元组对事物的可见性

      • T_datum一个新的元组在内存中形成的时候,我们不关心事物的可见性,因此在t_choice中需要用DatumTupleFields结构来记录元组的长度等信息,把内存的数据写入到表文件的时候,需要在元组中记录事物和命令ID,因此会把t_choice所占的内存转换成HeapTupleFields结构并且填充响应数据后再进行元组的插入。
    1. T_ctid用于记录当前元组或者新元组的物理位置,块号和块内偏移量,例如(0,1)第一个块内的第一个linp,若tuple被跟新,那么就记录新版本的物理位置
    2. T_infomask2使用其低11位标识当前tuple的attribute的个数,其他位用于HOT以及tuple可见性的标志位
    3. T_infomask用于标识tuple当前的状态,比如是否有OID,是否空的字段,t_infomask每一位代表一种状态,总共16种。

    T_hoff标识tuple中的头的大小

    T_bits[]用来标记该tuple中那些字段是空的

  • 相关阅读:
    安装yum源和gcc编译器遇到的问题
    (转)Linux下C++开发初探
    (转)求模和求余
    scanf———while(scanf ("%lu",&num) = =1)什么意思
    【Eclipse】 Alt+/ 代码提示问题解决方案
    【正则表达式】常用正则表达式
    【JAVA】Quartz中时间表达式的设置
    【Oracle】如何导库
    【JAVA】JMX简单使用方法
    【JAVA】Math.Round()函数常见问题“四舍5入”
  • 原文地址:https://www.cnblogs.com/sangli/p/6404771.html
Copyright © 2011-2022 走看看