postgresql 分割_PostgreSQL修改字段由大到小 为什么会rewrite table?

cbdb8ea40585aa851ae053d0de8d30fb.gif

(本文阅读预计时间:5分钟)

文章转载自公众号:AustinDatabases

作者:carol11

最近有一位同学问关于修改字段为什么改大不rewrite table但是改小字段长度就会导致rewrite table,其实这就是PostgreSQL在修改字段上面有一个问题,这就是人尽皆知的rewrite,rewrite本身并没有什么错误的,但是如果在线进行大表的操作者就会引起表锁,导致业务中断。那问题来了,为什么会修改表的结构对于varchar从大到小,或者数据类型变化会导致rewrite table

97b8327a8a851e77abb51f49378384c2.png

上面这张图大家都熟悉,就是PostgreSQL的页面的图形,从上图看一个页面中下面是保存的行的数据,上面是item是存储空间分配的指针,这一行数据从哪里到哪里,头尾相接的一种数据结构。之前老版本的PostgreSQL无论是将字段由小改大还是反过来都是导致表的rewrite

那么我们需要验证PostgreSQL为什么在新版本中对于扩展不在进行重写而对于收缩还是会导致收缩。

我们通过逻辑分析来考虑

1. 通过item指针来进行行的分割的话,那么增加一个行的长度并没有触犯item的底线,因为之前的一行里面的字段长度是固定的也就是可以预分配这个空间,而如果我将varchar(30)改变为varchar(40)则原有的行都不需要变动,疑问都符合varchar(40)以内,所以只有后续的行的数据会进行会进行扩展,那就不会导致存储空间的溢出。所以以小改大都是可以的。

  • Field Type Length Offset Description

  • t_xmin TransactionId 4 bytes 0 insert XID stamp

  • t_xmax TransactionId 4 bytes 4 delete XID stamp

  • t_cid CommandId 4 bytes 8 insert and/or delete CID stamp (overlays with t_xvac)

  • t_xvac TransactionId 4 bytes 8 XID for VACUUM operation moving a row version

  • t_ctid ItemPointerData 6 bytes 12 current TID of this or newer row version

  • t_infomask2 uint16 2 bytes 18 number of attributes, plus various flag bits

  • t_infomask uint16 2 bytes 20 various flag bits

  • t_hoff uint8 1 byte 22 offset to user data

3bfbbb0c13684ac6254832d6eb4e4edb.png

上图是一个表的信息,我看可以看到t_hoff是存储用户数据的地方

11648723996d6bebf319fb95ad8afcb9.png

详情请查看网址:

https://www.programmersought.com/article/7081994849/

2. 如果是缩小字段会引起数据长度的变化和收缩,则会这样的情况下就需要重新写表,至少对先前定义的内容以及界限进行重新组织。

这点可以在tiemid.h找到一些线索

https://doxygen.postgresql.org/structItemIdData.html

其中itemid.h其中包含了lp_off  lp_flags  lp_len等几个data fields

https://medium.com/@djboris/postgresql-physical-storage-of-rows-da20a1389509

其中个图片对上面hexdump中的HEX:18进行了描述。

bfe4b5e0ea2833337c3d36006439e995.png

7d474263de2c893c23a0874257eaed24.png

f0efce23f5510745b72efca7cf814ca3.png

de1e0e4ef1677dd5451c48c7d0828b75.png

eddc483147d5ea2b34a9f084847bb992.png

规模空前,再创历史 | 2020 PG亚洲大会圆满结束 PG ACE计划的正式发布 三期PostgreSQL国际线上沙龙活动的举办 六期PostgreSQL国内线上沙龙活动的举办

中国PostgreSQL分会与腾讯云战略合作协议签订

33ce420d39ee10502095e904d188547e.png

PostgreSQL 13.0 正式版发布通告

深度报告:开源协议那些事儿

从“非主流”到“潮流”,开源早已值得拥有

Oracle中国正在进行新一轮裁员,传 N+6 补偿

PostgreSQL与MySQL版权比较

新闻|Babelfish使PostgreSQL直接兼容SQL Server应用程序

四年三冠,PostgreSQL再度荣获“年度数据库”

d60d6cc3d0113378fd8af509ec443b99.png

更多新闻资讯行业动态技术热点,请关注中国PostgreSQL分会官方网站

http://www.postgresqlchina.com

中国PostgreSQL分会生态产品

http://www.pgfans.cn

中国PostgreSQL分会资源下载站

http://postgreshub.cn

ded0108343853090c0bc4d99e02d007d.png

dc99f237ae3f814d9a45c90ee8b991f3.png

↓↓↓

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值