postgresql_internals学习笔记(二)常规vacuum

news2024/10/7 11:31:34

一、 作用与原理

       page pruning执行速度很快,但它们的作用范围毕竟只有单页、且不包含索引,因此,我们还需要更有效的清理机制。

       常规vacuum是最常用的一种,作用范围可以是整张表,清理过期元组及索引项,并且不阻塞读和写。为提高效率,vacuum会结合前面提到的.vm文件,跳过不需清理的页。清理之后,还会更新前面提到的fsm(空闲空间映射)文件。

       另外还可以用vacuum analyze顺便收集统计信息。

二、 vacuum案例

CREATE TABLE vac(id integer,s char(100)) WITH (autovacuum_enabled = off);
CREATE INDEX vac_s ON vac(s);
INSERT INTO vac(id,s) VALUES (1,'A');
UPDATE vac SET s = 'B';
UPDATE vac SET s = 'C';

SELECT * FROM heap_page('vac',0);
SELECT * FROM index_page('vac_s',1);

       Vacuum基于database horizon检查和清理表和索引中的死元组,尚未过期的元组不能清理。

VACUUM vac;
SELECT * FROM heap_page('vac',0);
SELECT * FROM index_page('vac_s',1);

Vacuum之后pg会为vac表创建vm和fsm文件

安装插件可以看到某页中的元组是否均可见

CREATE EXTENSION if not exists pg_visibility;
SELECT all_visible FROM pg_visibility_map('vac',0);

如果不想安装,从页头信息也可以看到

SELECT flags & 4 > 0 AS all_visible FROM page_header(get_raw_page('vac',0));

三、 Vacuum阶段

1. 查看vacuum详情

postgres=# VACUUM VERBOSE vac;

INFO:  vacuuming "public.vac"

INFO:  scanned index "vac_s" to remove 1 row versions

DETAIL:  CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

INFO:  table "vac": removed 1 dead item identifiers in 1 pages

DETAIL:  CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s

INFO:  index "vac_s" now contains 2 row versions in 2 pages

DETAIL:  1 index row versions were removed.

0 index pages were newly deleted.

0 index pages are currently deleted, of which 0 are currently reusable.

CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.

INFO:  table "vac": found 1 removable, 2 nonremovable row versions in 1 out of 1 pages

DETAIL:  1 dead row versions cannot be removed yet, oldest xmin: 808

Skipped 0 pages due to buffer pins, 0 frozen pages.

CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.

VACUUM

     它列出了扫描的表和索引、cpu及耗时、删除了多少项、不能删除的有多少项、database horizon(红色部分)、跳过多少项、冻结多少个页,非常详细,根据它也可以大致推断vacuum的执行阶段。

查看vacuum进度

SELECT * FROM pg_stat_progress_vacuum \gx

2. 主要阶段

1)表扫描

  • 读取vm文件,跳过其中页面
  • 根据database horizon扫描死元组,并将还需要被索引引用的元组id加入一个特殊的tid数组,这些元组暂时不能清理
  • 这部分可用内存取决于maintenance_work_mem

2)索引vacuum

  • 表上的所有索引被完整扫描,找到引用tid数组中元组的对应索引项
  • 从索引页中删除这些索引项
  • 如果索引大小超过min_parallel_index_scan_size,将会启用并行
  • 更新fsm文件并收集统计信息
  • 如果只对表进行过insert,会直接跳过本阶段

3)表vacuum

  • 删除tid数组中的元组及对应指针(此时所有索引引用已被删除)
  • 更新fsm和vm文件
  • 清理tid数组

4)表截断(heap truncation

  • 特殊场景:如果清空的页刚好在文件末尾,vacuum可以将这些空间归还给操作系统
  • heap truncation会短暂持有排它锁
  • 由于排它锁会影响业务,pg只在文件末尾有至少1000个页,或者达到表大小的1/16时,才执行截断。这两个参数是硬编码,不能修改。
  • 如果确实怕被排它锁影响业务,可以在表级设置vacuum_truncate和toast.vacuum_truncate参数,禁用该功能:ALTER TABLE some_table SET (vacuum_truncate = off);

未完待续...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS图层+移动工具(1)图层概念-拖动操作-移动工具基础

先打开ps软件 然后点击进入工作区 选择右上角文件 点击打开 随便选一个要操作的图片 然后看一下自己工作区右侧的 这个图层工具开了没有 如果没开 点击上方 窗口 将图层选项勾选上 这里可以看到 我们打开一个完整图片 他就只有一个图层 触发你打开的是PSD格式的图片 psd是ps…

【云计算与大数据技术】云交付模型、云部署模型、云计算优势与挑战、应用的讲解(超详细必看)

一、云交付模型 云计算主要分为三种交付模型,而且这三种交付模型主要是从用户体验的角度出发的,分别是软件即服务(SaaS),平台即服务(PaaS),基础设施即服务(IaaS&#xf…

数据库建表的 15 个最佳实践方式

前言 对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节。 系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。 后端开发的日常工作&#xff…

string的模拟实现

目录 ​一、模拟实现中类的组织 二、默认成员函数 1.默认构造函数 2.拷贝构造函数 (1)传统写法——循规蹈矩 (2)现代写法——偷天换日 3.析构函数 4.赋值运算符重载 二、元素访问 三、容量操作 1.容量与有效数据 2.改…

SpringBootStarter技术:生产就绪与环境配置、实现自定义Starter

● Spring 官 方 Starter : 命 名 应 遵 循 spring-boot-starter-{name} 的 格 式 , 如 spring-boot-starter-web 作 为 SpringBoot Web模块的官方artifactId。 ● Spring 非 官 方 Starter : 命 名 应 遵 循 {name}-spring-bootstarter的格…

ModBus_RTU-上位机经RS485接口与PLC通信

目录: 一、预备知识 二、上位机经RS485接口与PLC通信 ---------------------------------------------------------------------------------------------------------------------- 一、预备知识 电力-ModBus_RTU通讯规约1 电力-ModBus_RTU通讯规约2 通信-R…

Java基于springboot+vue足球联赛管理系统

本足球联赛管理系统是针对目前足球联赛管理的实际需求,从实际工作出发,对过去的足球联赛管理系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率…

字符串处理【后缀数组】 - 原理2 后缀数组

字符串处理【后缀数组】 - 原理2 后缀数组 在字符串处理中,后缀树和后缀数组(Suffix Array)都是非常有力的工具。 后缀数组是后缀树的一个非常精巧的替代品,比后缀树容易实现,可以实现后缀树的很多功能,时…

Jenkins

目录 一、什么是Jenkins 二、为什么需要使用持续集成工具 三、如何搭建jenkins服务 四、jenkins集成服务器上的JDK 五、jenkins集成git 5.1 jenkins所在的服务安装git 5.2 jenkins集成git 5.3 jenkins创建一个任务项 5.4 创建远程仓库 5.5 执行任务 六、jenkins集成maven…

[附源码]Python计算机毕业设计SSM基于的校园商城(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

人工智能写代码 !ChatGPT VScode 插件 真正打败AI人工智能的只能是AI人工智能自己。

前言: 真正打败你的只能是你自己。 真正打败程序员的只能是程序员自己。 真正打败AI人工智能的只能是AI人工智能自己。 人工智能写代码 !上线3天,下载4万,ChatGPT中文版VSCode插件来了,程序员要失业了吗? 还没开始就遇…

[附源码]JAVA毕业设计医院挂号系统(系统+LW)

[附源码]JAVA毕业设计医院挂号系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

VoIP通话-基于SIP协议的Asterisk(零)-Demo

文章首发及后续更新:https://mwhls.top/4116.html,无图/无目录/格式错误/更多相关请至首发页查看。 新的更新内容请到mwhls.top查看。 欢迎提出任何疑问及批评,非常感谢! VoIP通话-基于SIP协议的Asterisk这篇为 Demo,是…

LabVIEW如何实现高性能串口助手-附代码

LabVIEW基本上还是在Windows系统下进行开发。在Windows下,提供了非常多的系统接口,供应用开发时调用来实现各种功能,在LabVIEW里面也是可以通过对这些系统接口进行封装,形成LabVIEW里面的控件,供LabVIEW程序开发时调用…

mongo实时导入到clickhouse案例(包含复杂嵌套json的解析)

(一)案例介绍 本案例是把Mongo数据库的数据通过FlinkCDC实时导入到Kafka&#xff0c;消费Kafka数据把维表数据写入到MySQL。读取MySQL维表数据和消费Kafka的数据通过Flink SQL Join后导入到ClickHouse。 (二) maven依赖 <?xml version"1.0" encoding"UTF-…

数字人的生死疲劳

你看好数字人吗&#xff1f;这个问题在今天似乎颇难回答。如果从宏观趋势上看&#xff0c;数字人的利好要素似乎已经达到了一个空前的高度。比如有市场分析机构预测&#xff0c;到2026年中国AI数字人的市场规模将突破100亿人民币&#xff0c;整体市场呈现高速增长态势。又比如今…

git基础之三|初始化本地库、新建文件、提交代码、版本回退、穿梭等使用命令集合【2022最全版】

Git作为版本管理的软件&#xff0c;在我们的协同工作中非常重要。因此&#xff0c;对于Git的常见命令&#xff0c;如新建、编辑文件、提交版本、版本回退等操作必须要熟悉。 Git常用命令一、初始化本地库1、创建项目文件夹2、右击选择Git bash3、在bash中输入4、查看创建的结果…

mysql索引中最左前缀原则

最左前缀原则 最先匹配最左边的索引&#xff0c;匹配上就继续&#xff0c;如果匹配不上就检索不到 (a,b,c是索引) where后面的条件有没有给a对应的条件 不给定a等于几&#xff0c;是没法儿查询出结果的&#xff0c; 因为辅助聚簇索引是把索引按照组合索引的顺序存到一起的&…

IoTDB 可实现的基本操作 —— 数据写入、删除、导出、元数据管理、时区设置 | 小白教程文档(四)...

前言上篇教程介绍了 Apache IoTDB 处理时序数据时&#xff0c;能够实现的部分具体功能和具体的操作命令&#xff0c;包括数据导入、基本查询、和聚合查询。本篇将继续介绍 Apache IoTDB 可实现的其他功能和相关 SQL 语句命令&#xff0c;包括数据的写入、删除、导出、元数据操作…

python 解析库Beautiful Soup的安装

Beautiful Soup的安装一、Beautiful Soup的安装1.1 安装lxml库1.2 安装beautifulsoup41.3 验证beautifulsoup4能否运行一、Beautiful Soup的安装 Beautiful Soup是Python的一个HTML或XML的解析库&#xff0c;使用它可以很方便地从网页中提取数据。它的解析器是依赖于lxml库的&…