当前位置: 首页 > news >正文

cluster、update、delete在死元组清理上的作用

简介

在 PostgreSQL 中,为了支持 MVCC(多版本并发控制),对表中行的更新和删除并不会立刻移除旧的数据行,而是:
更新操作:创建一个新的行版本(tuple),原来的行变成“死元组”。
删除操作:标记该行为删除(也是变成死元组),但仍然保留在表中一段时间。
因此,死元组就是对其他事务来说已经无效的旧数据行。
很多人可能不知道,除了vacuum会清理死元组,实际上update、delete 也会清理死元组。

update

update在特定情况下也会将死元组清理掉 ,创建一个填充率为100的,并禁用其autovacuum

DROP TABLE IF EXISTS test_fillfactor;

CREATE TABLE test_fillfactor (
    id SERIAL PRIMARY KEY,
    content TEXT
)  WITH (fillfactor = 100,autovacuum_enabled = false, toast.autovacuum_enabled = false);  

向其中插入刚刚分页的数据量

INSERT INTO test_fillfactor (content)
SELECT repeat('a', 111) || generate_series(1 ,57);

我们使用pg_dirtyread去看其死元组情况。

create extension pg_dirtyread;
SELECT txid_current(),t.* FROM pg_dirtyread('test_fillfactor') as t(tableoid oid, ctid tid, xmin xid, xmax xid, cmin cid, cmax cid, dead boolean,id integer,content TEXT) order by ctid desc limit 5 ;

在这里插入图片描述

此时我们更新第一页的最后一条数据和新页第一条数据(id=55和id=56),由于填充因子是100 此时新的数据并不会追加的页末尾。

checkpoint; --执行检查点,让其fsync
UPDATE test_fillfactor SET content = repeat('b', 111)||'(1.1)' WHERE id=56;
UPDATE test_fillfactor SET content = repeat('b', 111)||'(0.55)' WHERE id=55;
SELECT txid_current(),t.* FROM pg_dirtyread('test_fillfactor') as t(tableoid oid, ctid tid, xmin xid, xmax xid, cmin cid, cmax cid, dead boolean,id integer,content TEXT) order by ctid desc limit 5 ;  --此时的死元组依然存在。

在这里插入图片描述

当执行一段查询之后

SELECT txid_current(),xmin, xmax, ctid, * FROM test_fillfactor  order by ctid desc limit 5 ;
SELECT txid_current(),t.* FROM pg_dirtyread('test_fillfactor') as t(tableoid oid, ctid tid, xmin xid, xmax xid, cmin cid, cmax cid, dead boolean,id integer,content TEXT)  order by ctid desc limit 5 ;  --此时的死元组id=55的便消失。

在这里插入图片描述

此时通过系统视图查看其仍然有两条死元组,其中一条update 是n_tup_hot_upd,另一条并没有追加到也末尾,(0.55)数据追加到了(1,4)。

select  *  from pg_stat_user_tables where  relname ='test_fillfactor';

在这里插入图片描述
我们再通过pageinspect跟踪看一下0页的数据情况


                

相关文章:

  • boss zp_stoken补环境
  • TQ15EG开发板教程:AD9361观测adc采集波形
  • Elasticsearch 系列专题 - 第七篇:实战项目
  • Ubuntu 22.04 完美安装 ABAQUS 教程:从零到上手,解决兼容问题
  • 数据结构(1)
  • Outbound Email的未来:从冷启动邮件到智能化营销
  • 使用 TFIDF+分类器 范式进行企业级文本分类(二)
  • 什么是柜台债
  • Boost Graph Library (BGL) 介绍与使用示例
  • Large Language Model(LLM)的训练和微调
  • 专题十四:动态路由——OSPF
  • MySQL InnoDB 索引与B+树面试题20道
  • 大模型论文:Language Models are Few-Shot Learners(GPT3)
  • 单调栈 —— 1.基本概念与核心算法
  • 库学习04——numpy
  • Linux——文件(3)软硬连接和动静态库
  • 动态多目标进化算法:基于知识转移和维护功能的动态多目标进化算法(KTM-DMOEA)求解CEC2018(DF1-DF14)
  • go语言从零开始_golang语言介绍_windows下搭建开发环境_VSCode开发go程序配置---go语言工作笔记001
  • MySQL 中为产品添加灵活的自定义属性(如 color/size)
  • GD32F303-IAP的过程和实验
  • 开发一个手机系统有多难/苏州网站seo服务
  • 做网站单页/指数基金有哪些
  • 杭州专业网站设计制作/网站超级外链
  • 制作网站哪家专业/抖音关键词排名查询
  • 充电宝网站建设策划书/百度应用市场app下载
  • 安徽网站建设费用/东莞seo优化