PostgreSQL的数据存储(十三)---数据存储


4.4     SQL操作对页面的影响

4.4.1       DML操作对于页面存储格式的影响

页面从一个新的状态,到放入数据,数据经过DML操作,页面的数据发生变化,在结果vacuum清理数据后,页面数据又变为一个整齐状态。如下从四个角度来说DML操作对于数据页面的影响。

 

一 空页面


PostgreSQL的数据存储(十三)---数据存储 - 那海蓝蓝 - 那海蓝蓝的博客

 

   一个页面大小为8k,其中,页头占一小部分,特殊块从页尾的位置占一小部分,其余大部分空间,为数据占用。在上图中,“页数据”标识的位置处,都是用于存储数据的。

 

二 数据插入后页面的状态

 

如果是往一个表上插入数据,其插入方式,如上图,从页尾开始存放第一条记录,然后是第二条、直至本页空间不够。

如果是不同的表,PG的处理方式,是不同表由不同文件组成,不同文件的块(8k)映射不同的buf,则往不同的表上插入数据的时候,对应的页一定不同。

 

三 数据删除后页面的状态

元组(tuple)的删除,则更为简单,对于页面来讲,当找到tuple所在的页,直接为tuple的一个“信息位”(cmax)置新的值即可。这说明,PG删除元组的操作,不是真正从页面上把元组去掉,也不是如Oracle,把旧信息置于回滚段,而是直接在元组头上标识一个“删除标志”。此标志,是一个数值型的一个值,表示一个被删除的元组是否被其他“事务”(活动着的连接)看到。[1]

以上描述,可以通过查看heap_delete函数的如下调用了解:

HeapTupleHeaderAdjustCmax(tp.t_data, &cid,&iscombo);

 

四 数据更新后页面的状态

元组更新,是删除操作和插入操作的组合。这点,可以从heap_update函数代码得知。

五 扩展知识

       以上四条,是用户表、用户数据在内存(数据页)中的数据增删改和初始新页面时的状态,系统表和系统表的数据,也是以tuple格式存放的,一样的存储方式。

    本节没有就索引页面的存储格式展开讨论。

    如下是相关函数的一部分调用关系:

PageHasFreeLinePointers     

       PageAddItem

              RelationPutHeapTuple

                     heap_insert

                            CopyFrom

                            intorel_receive

                            simple_heap_insert

                            ExecInsert

                            ATRewriteTable

                            toast_save_datum

                     heap_update

       PageGetHeapFreeSpace

 



[1] PG的MVCC技术,其中,涉及存储层的,有个名词叫做“元组可见性”,是原来表明哪些事务可以读到某个元组、哪些事务不能读到某个元组。

 “元组可见性”可以通过HeapTupleSatisfiesVisibility、HeapTupleSatisfiesUpdate等调用关系追踪。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值