PostgreSQL之Full VACUUM

前面我们介绍了PG中的Concurrent VACUUM,详细请参考PostgreSQL之Concurrent VACUUM,这篇我们继续来了解一下PG中的Full VACUUM。
我们了解Concurrent VACUUM允许在执行的时候仍然允许对正在VACUUM的表进行读取操作,因此这个操作对业务的影响也比较小。但是Full VACUUM在执行期间是不允许对相关表进行任何操作的,所以它对业务的影响也比较大,那么为什么还需要Full VACUUM呢?

我们假如以下一种场景,一个表有三个Page,每个Page里面有6条Tuple,如下图所示。
在这里插入图片描述
然后我们执行以下操作,

testdb=# DELETE FROM tbl WHERE id % 6 != 0;
testdb=# VACUUM tbl;

VACUUM结束后,我们发现每个页面中现在只剩下一条Tuple了,不过仍然还是有三个Page存在。如果我们想查询这三条数据,那么仍然需要访问三个Page。由于每个Page是大小固定的,因此表的SIZE仍然没有变化。所以,Concurrent VACUUM动作后只是可以让页面中的部分空间可以重用,但是并不能真正释放空间。
为了解决真实可以释放空间这个问题,因此才有了Full VACUUM。
在这里插入图片描述上图是Full VACUUM的整个过程,可以总结为以下步骤:

  1. 创建新文件 -当针对某个表调用VACUUM FULL命令时,首先会获取表上的AccessExclusiveLock锁,然后创建一个新的表文件(大小为8KB),此后表不能被读写。
  2. 将活跃的tuples拷贝到新文件 -将老文件中活跃的tuples拷贝到新的文件中。
  3. 删除老文件,重建索引,更新统计信息、FSM及VM -在完成拷贝活跃tuples到新文件后,删除老的文件,然后重建索引,更新表对应的FSM和VM文件,更新相关的统计信息及数据。

Full VACUUM步骤的伪代码如下:

(1)  FOR each table
(2)       Acquire AccessExclusiveLock lock for the table
(3)       Create a new table file
(4)       FOR each live tuple in the old table
(5)            Copy the live tuple to the new table file
(6)            Freeze the tuple IF necessary
            END FOR
(7)        Remove the old table file
(8)        Rebuild all indexes
(9)        Update FSM and VM
(10)      Update statistics
            Release AccessExclusiveLock lock
       END FOR
(11)  Remove unnecessary clog files and pages if possibl

注:FULL VACUUM有两个注意事项:

  • Full VACUUM过程中表不能被访问
  • 由于是先创建新文件,拷贝后再删除老文件,最多会有2倍的空间占用

什么时候执行Full VACUUM?

这个没有一个标准,可以借用pg_freespacemap插件来查看表对应的FreeSpace大小。执行VACUUM后有什么变化,执行Full VACUUM后有什么变化。

testdb=# CREATE EXTENSION pg_freespacemap;
CREATE EXTENSION

testdb=# SELECT count(*) as "number of pages",
       pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
       round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
       FROM pg_freespace('accounts');
 number of pages | Av. freespace size | Av. freespace ratio 
-----------------+--------------------+---------------------
            1640 | 99 bytes           |                1.21
(1 row)

testdb=# DELETE FROM accounts WHERE aid %10 != 0 OR aid < 100;
DELETE 90009

testdb=# VACUUM accounts;
VACUUM

testdb=# SELECT count(*) as "number of pages",
       pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
       round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
       FROM pg_freespace('accounts');
 number of pages | Av. freespace size | Av. freespace ratio 
-----------------+--------------------+---------------------
            1640 | 7124 bytes         |               86.97
(1 row)

testdb=# SELECT *, round(100 * avail/8192 ,2) as "freespace ratio"
                FROM pg_freespace('accounts');
 blkno | avail | freespace ratio 
-------+-------+-----------------
     0 |  7904 |           96.00
     1 |  7520 |           91.00
     2 |  7136 |           87.00
     3 |  7136 |           87.00
     4 |  7136 |           87.00
     5 |  7136 |           87.00

testdb=# VACUUM FULL accounts;
VACUUM
testdb=# SELECT count(*) as "number of blocks",
       pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
       round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
       FROM pg_freespace('accounts');
 number of pages | Av. freespace size | Av. freespace ratio 
-----------------+--------------------+---------------------
             164 | 0 bytes            |                0.00
(1 row)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学成在线:第五天(p82-p93)

1、面试&#xff1a;在分片广播中&#xff0c;如何保证多个执行器不会重复执行任务&#xff1f; &#xff08;虽然有分片序号&#xff0c;但是加入只有两个执行器&#xff0c;有很多任务&#xff0c;这两个执行器得到的分片序号也就只是两个数字&#xff0c;后面的分片是如何能…

蓝桥杯刷题冲刺 | 倒计时11天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.质因子2.蓝桥王国1.质因子 题目 链接&#xff1a; 1545. 质因子 - AcWing题库 给定一个整数 N…

NexNoSQL Client:Elasticsearch、Redis、MongoDB三合一的可视化客户端管理工具

背景&#xff1a; 工作中我们使用了Elasticsearch作为存储&#xff0c;来支持内容的搜索&#xff0c;Elasticsearch这个软件大家都耳熟能详&#xff0c;它是一个分布式、高扩展、高实时的搜索与数据分析引擎&#xff0c;不仅仅支持文本索引&#xff0c;还支持聚合操作&#xf…

Java面向对象部分 个人学习记录

注:此博客是个人学习记录&#xff0c;会有错的地方&#xff0c;面向对象部分我可能会画很多图来加深我的理解 不引出了&#xff0c;直接开始 class Dog{String name;int age;String type;public Dog(String name,int age,String type){this.namename;this.ageage;this.typetyp…

全志V3S嵌入式驱动开发(准备)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 要学好嵌入式&#xff0c;其实最好自己可以画板子、调试板子、写软件、调试软件这样来学习。简单的51单片机、stm32这样的mcu或许画起来不是很复杂…

Python 自动化指南(繁琐工作自动化)第二版:零、前言

关于作者 Al Sweigart 是一名软件开发人员和技术书籍作者。Python 是他最喜欢的编程语言&#xff0c;他是该语言的几个开源模块的开发者。他的其他书籍可以在他的网站上根据知识共享许可免费获得。他的猫现在重 11 磅。 关于技术评审 Philip James 从事 Python 工作已经超过…

MobTech 秒验|本机号码一键登录会泄露隐私吗

本机号码一键登录是一种新型的应用登录方式&#xff0c;它可以利用运营商的数据网关认证能力&#xff0c;实现手机号免密登录&#xff0c;提高用户体验和转化率&#xff0c;降低验证成本和流失率。本机号码一键登录支持三大运营商号码认证&#xff0c;3秒内完成手机号验证&…

Java小课堂:自定义注解(案例:自定义DecimalFormat注解)

文章目录 引言I 预备知识1.1 元注解1.2 Target注解的ElementType枚举1.3 Retention注解的RetentionPolicy枚举II 自定义注解2.1 基本条件2.2 注解自定义属性的格式III 案例3.1 自定义DecimalFormat注解3.2 自定义json序列化解析引言 需求: 编辑费率限制的值时填写几位就保存几…

如何在前端中实现精美的图片和文字的垂直对齐

&#x1f31f;所属专栏&#xff1a;前端只因变凤凰之路 &#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚 &#x1f62e;前言&#xff1a;该系列将持续更新前端的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章…

关于线性与条带化下LVM增加磁盘数据分布的讨论

关于线性与条带化下LVM增加磁盘数据分布的讨论一、环境介绍二、线性模式逻辑卷创建逻辑卷删除三、条带化逻辑卷创建逻辑卷删除LVM有两种模式&#xff1a;线性模式&#xff1a;先写满组成线性逻辑卷的第一个物理卷&#xff0c;再向第2个物理卷中写入数据&#xff0c;以此类推&am…

必看>>>>Linux数据库被其他服务器远程访问(修改权限、开设端口)

目录 一&#xff1a;修改权限 1.1 进入Linux数据库 1.2 修改数据库的远程连接权限 1.2.1 数据库远程权限修改命令 1.2.2 数据库远程权限查看命名 1.3 给Linux机添加端口 1.4 远程数据库连接 注意mysql中的中英文输入 一&#xff1a;修改权限 1.1 进入Linux数据库 文章…

【职场热点】软件测试岗位,真正达到月收入1万以上的有多少

在某一线城市相亲角&#xff0c;有位阿姨自称孩子是程序员、36岁、月入3万8&#xff0c;并直言“月入1万如讨饭”&#xff0c;引来大量互联网人自嘲式认领“乞丐”身份。今年2月&#xff0c;“月收入一万”的鄙视链压力给到了二线城市&#xff0c;有位入行2年的软件测试员发帖称…

1-python基础

1.字面量 被写在代码中固定的值 2.注释 # 单行注释""" 多行注释1&#xff1a;三对双引号 """ 多行注释2&#xff1a;三对单引号 3.变量与输出 age10 # 变量赋值 print("我今年",age,"岁") &#xff08;1&#xff09;pri…

Java数据类型与变量

1.字面常量 public class Demo{ public static void main(String[] args){ System.Out.println("hello world!"); System.Out.println(300); System.Out.println(3.1415926); System.Out.println(T); System.Out.println(true); System.Out.println(false); } 其中…

【CocosCreator入门】CocosCreator组件 | ParticleSystem (粒子)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中ParticleSystem组件是一个用于创建粒子效果的工具&#xff0c;可用于实现火花、爆炸、雪花等效果。 目录 一、组件属性 二、组件使用 三、效果演示 四、性能优化 一、组件属性 属性…

迅为3A5000_7A2000工控主板,龙芯自主指令集架构全国产工业级板卡性能

迅为iTOP-3A5000开发板核心板底板方式&#xff0c;底板资料开源&#xff0c;提供底板的原理图和PCB工程文件&#xff0c;可以根据需求定制属于自己的开发板。 核心板也支持工业级核心板定制开发。 根据二进制翻译功能使用&#xff0c;可流畅运行WIN和Android系统APP。 支持Loo…

renderdoc resource manager说明

*写在前面 只针对renderdoc opengl es 场景进行说明&#xff0c; vukan的没有&#xff0c;不过其实应该也差不多啦&#xff0c;若有必要后面再考虑补上。本文使用 文字图代码 的方式叙述&#xff0c;若只想了解原理过程&#xff0c;可忽略代码部分&#xff0c; 由于renderdoc代…

文章生成器-免费的文章生成器

随着信息爆炸的时代&#xff0c;自媒体人员不仅需要创造性的策略&#xff0c;还需要快速产生具有高质量文章的能力&#xff0c;这样才能快速响应趋势并保持优势。文章生成器&#xff0c;一款基于人工智能和自然语言处理技术的文本生成软件&#xff0c;可在没有任何人工干预的情…

企业搭建帮助中心的额方式有哪些?

帮助中心对于企业价值的重要性在于提高客户满意度和忠诚度&#xff0c;增强企业品牌形象&#xff0c;促进业务增长和提高利润率。通过提供详细的帮助文档和客户支持&#xff0c;企业可以向客户传达其专业知识和技能&#xff0c;并帮助客户更好地使用其产品或服务。这将提高客户…

C++(Qt)软件调试---使用任务管理器导出Dump(6)

C(Qt)软件调试—使用任务管理器导出Dump&#xff08;6&#xff09; 文章目录C(Qt)软件调试---使用任务管理器导出Dump&#xff08;6&#xff09;1、前言2、软件下载3、使用三款软件导出Dump4、软件下载地址更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f44…