暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

dml和元组结构

點點 2024-04-28
203

元组结构

堆元组可分为普通元组和TOAST元组两类

堆元组由三个部分组成,即HeapTupleHeaderData结构,控制位图及用户数据。

  •  t_xmin:保存插入此元组的事务的txid,通俗的讲修改这一行的事务id号

     t_xmax:保存删除或更新此元组的事务的txid。如果尚未删除或更新此元组,则t_xmax设置为0,即无效。通俗的讲该行被哪个事务所修改,如果为0则表示未被修改过

     t_cid:保存命令标识(cid) ,cid的意思是在当前事务中,执行当前命令之前执行了多少sql命令,从0开始计数

     t_ctid:保存着指向自身或新元组的元组标识符(tid)。tid用于标识表中的元组。在更新该元组时,t_ctid会指向新版本的元组,否则t_ctid会指向自己

     


元组的增、删、改

元组的具体表示如图:



通过pageinspect插件可以用于检查数据库页面的具体内容

heap_page_items显示一个堆表页面上所有的行指针,对于使用中的行指针,元组头部和元组原始数据也会被显示。 不管元组对于拷贝原始页面时的 MVCC 快照是否可见,它们都会被显示

create extension  pageinspect;

select lp as tuple,t_xmin,t_xmax,t_field3 as t_cid,t_ctid from heap_page_items(get_raw_page('tb1', 0));


 

t_xmin:为1116,表示此元组由txid=1116的事务所插入

t_xmax:为0,表示此元组尚未被删除或更新

t_cid:为0,表示此元组是由txid=1116的事务所执行的第一条命令插入的

t_ctid:(0,1),指向自身,因为这是该元组的最新版本


update操作


 

执行更新后,将t_xmax值修改为1117,逻辑上删除tuple_1,然后插入tuple_2,再将元组1的t_ctid重写指向为元组2




delete操作



执行删除后,会将t_xmax值修改为1118并打上delete标记,但数据不会被立刻删除




vacuum操作

块中被删除的行是逻辑上的删除,其物理上依然保留在块中。长时间不清理会导致空间膨胀。假设一个数据块中有50%的垃圾数据,那么意味着浪费了50%的存储空间。块读取到内存中也将导致浪费50%的内存空间,清理工作由auto vacuum进程自动清理



最后修改时间:2024-04-28 18:29:12
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论