【译】PostgreSQL 14 B-Tree Index:通过自下而上删除减少膨胀

成功毕业!将毕业前求到的【Java毕设合集】20套毕设项目(附源码)任意挑选,速来白嫖!手把手教学_Java入门_Java基础_Java项目_Java开发_哔哩哔哩_bilibili

前言

对 PostgreSQL 中数据的并发访问由多版本并发控制 (MVCC) 模型管理。 为每个 SQL 语句维护数据快照,以便它们始终获得一致的数据,即使其他事务正在同时对其进行修改。 当行已被一个或多个事务修改时,这将导致管理同一行的多个版本。 从用户的角度来看,可能只有一行数据,但 PostgreSQL 内部可能维护该行的一个或多个版本。

行版本是否对事务可见是通过堆中的行数据来维护的。 为了优化可见性信息的获取,PostgreSQL 还维护了一个“_vm”关系分支,它跟踪那些只包含对所有活跃事务可见的元组的页面。

对任何事务不再可见的死版本将由 vacuum 进程清除。 在此之前,索引和堆页面可能包含大量死元组(这实际上取决于您的工作负载的性质)。 对于更新密集型工作负载,这可能是一个巨大的数字!

乍一看似乎无害,但这种死索引元组的累积会产生级联效应,从而导致性能显着下降。 在 PostgreSQL 13 中完成重复数据删除工作后,下一个合乎逻辑的步骤是通过减少页面拆分来防止 btree 索引膨胀。

物理数据存储

PostgreSQL 将数据保存在被称为页面的固定大小存储单元中。 页面的大小是在 PostgreSQL 服务器编译过程中定义的。 默认页面大小为 8k,但可以将其更改为更高的值。 虽然更改页面大小会使事情变得复杂,因为其他工具可能也需要重新编译或重新配置。

每个表和索引都存储在页数组中。 将数据插入表中时,会将数据写入具有足够可用空间的页面。 否则,将创建一个新页面。

然而,索引有点不同。 索引中的第一页是一个元页面,其中包含有关索引的控制信息。 也有一些特殊的页面来维护索引相关的信息。 对于 btree 索引,数据必须根据索引列和堆元组 ID(元组在表中的物理位置)进行排序。 因此,插入和更新必须在正确的页面上进行,以保持排序顺序。 如果页面没有足够的空间容纳传入的元组,则必须创建新页面,并将溢出页面中的一些项目移动到新页面。 如果需要,这些叶子页面的父页面会被递归拆分。

避免页面分裂

当新的元组或新的非 HOT 元组版本要添加到索引中时&#x

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值