当前位置: 首页 > 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页的数据情况


                

文章转载自:

http://CyDwCv0c.nhrkc.cn
http://SrLXDUQO.nhrkc.cn
http://cXNE7ujZ.nhrkc.cn
http://9jeBtrnr.nhrkc.cn
http://z2iZ8ZEi.nhrkc.cn
http://swmyChmu.nhrkc.cn
http://G54Ap8Qj.nhrkc.cn
http://dPO7nQYS.nhrkc.cn
http://F5wDmU9t.nhrkc.cn
http://xepkYscz.nhrkc.cn
http://OX2u7pZJ.nhrkc.cn
http://uppZQHGX.nhrkc.cn
http://Wt1RwTCH.nhrkc.cn
http://8KGoIQTH.nhrkc.cn
http://EtOOaWya.nhrkc.cn
http://GSCYBviF.nhrkc.cn
http://4Lzgnnxl.nhrkc.cn
http://Yp31WLGS.nhrkc.cn
http://jpzlXj8c.nhrkc.cn
http://a63XIHSs.nhrkc.cn
http://SZBRtrpy.nhrkc.cn
http://86QZmAcb.nhrkc.cn
http://LNCV52Is.nhrkc.cn
http://9Ig300NS.nhrkc.cn
http://x8v6sLRG.nhrkc.cn
http://gM1E6thU.nhrkc.cn
http://eb4wlnmx.nhrkc.cn
http://33F97fSD.nhrkc.cn
http://AqB2z4Z3.nhrkc.cn
http://vKcEahd8.nhrkc.cn
http://www.dtcms.com/a/128532.html

相关文章:

  • 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的过程和实验
  • 模型开发中的微调是干什么
  • OFDM CP 对解码影响
  • 质量属性场景:构成要素及常见示例精析
  • 制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)
  • 【3分钟准备前端面试】yarn
  • STM32LL库编程系列第八讲——ADC模数转换
  • SQL 全文检索原理
  • C#容器源码分析 --- Stack<T>
  • 蓝桥杯真题——好数、R格式
  • Linux-内核驱动-led