YUNBE云贝-PostgreSQL Vacuum详解:深入理解与实践

引言

PostgreSQL作为一款功能强大、开源的关系型数据库管理系统,其性能优化机制中,“VACUUM”命令扮演着至关重要的角色。本文将对PostgreSQL的VACUUM操作进行全面解析,探讨其工作原理、类型以及如何在实际环境中合理应用。

一、VACUUM基础概念

1.1 VACUUM的作用

在PostgreSQL中,当数据被更新或删除时,系统并不会立即释放物理空间,而是将其标记为“可重用”。随着时间推移,表中的死元组(已删除或已被新版本覆盖的数据)会越来越多,这不仅会导致存储空间利用率下降,也可能影响查询性能,因为查询需要遍历这些无用的元组。而VACUUM命令的主要任务就是清理这些死元组,并回收相应的存储空间。

1.2 VACUUM的工作方式

执行VACUUM命令后,PostgreSQL会扫描表并:

• 删除无效的行版本

• 更新表的统计信息以提高查询计划器的准确性

• 如果启用了autovacuum_freeze_max_age参数,还会防止事务ID过多导致的老化问题

对于支持MVCC(多版本并发控制)的PostgreSQL,VACUUM还负责冻结旧的事务ID,确保事务可见性信息的有效管理。

二、VACUUM类型

2.1 VACUUM常规操作

普通的VACUUM命令仅能清除无效行版本和更新统计信息,但不能完全压缩表以释放磁盘空间。

VACUUM table_name;

2.2 VACUUM FULL操作

VACUUM FULL则更为激进,它不仅执行常规VACUUM的功能,还能彻底整理表,使其占用的空间最小化,类似于重建表的效果。但需要注意的是,VACUUM FULL会锁定整个表,在大表上可能造成较长时间的阻塞。

VACUUM FULL table_name;

2.3 自动Vacuum(Autovacuum)

为了减轻手动执行VACUUM的压力,PostgreSQL提供了Autovacuum后台进程,可以根据配置自动定期执行VACUUM。Autovacuum能够监控表的更新情况,并在满足一定条件时自动触发VACUUM操作。

三、VACUUM实验过程

为了直观地理解PostgreSQL的VACUUM操作,我们可以进行以下实验:

实验1:创建并填充测试表

-- 创建一个用于实验的表,并插入数据

图片

-- 填充10,000行数据
 

图片

图片

-- 记录初始表大小(以字节为单位)

图片

图片

实验2:执行更新和删除操作以产生死元组

-- 执行大量更新操作,模拟事务更新

图片

-- 执行删除操作,生成被删除但未释放空间的数据

图片

-- 检查表中当前的行数与之前的总数做对比

图片

实验3:执行常规VACUUM

-- 执行常规VACUUM命令

图片

-- 检查表的最新大小,常规VACUUM可能不会减少物理文件大小

图片

实验4:查询pg_stat_user_tables

视图观察影响

-- 查看`n_dead_tup`字段的变化,它反映了表中的死元组数量

图片

-- 同时也可以查看其他与vacuum相关的统计信息

图片

实验5:执行VACUUM FULL

注意:在生产环境中应谨慎使用VACUUM FULL,因为它可能导致表锁定并在大表上消耗较长时间。

-- 执行VACUUM FULL,此操作会整理表空间并回收所有废弃空间

图片

-- 再次检查表的大小,这次应该能看到明显的减小

图片

实验6:配置和观察Autovacuum行为

• 首先,确保Autovacuum已启用且设置合理:

图片

• 进行更多的更新和删除操作后,不手动执行VACUUM,而是等待Autovacuum自动运行。

图片

• 监控Autovacuum活动和表状态:

-- 观察当前正在进行的Autovacuum进程

图片

-- 或者定期检查`pg_stat_user_tables`视图,查看n_dead_tup是否在减少

图片

通过以上步骤,您将更加深入地了解PostgreSQL VACUUM的执行过程、效果以及Autovacuum如何根据参数设置自动进行清理工作。实际应用中,请结合实际情况调整Vacuum相关参数,优化数据库性能。

四、VACUUM最佳实践

定期执行VACUUM:根据业务负载情况,设置合理的VACUUM策略,尤其针对频繁更新的大表。

• 启用并调优Autovacuum:大部分情况下,应依赖于Autovacuum来维护数据库健康。通过调整autovacuum_vacuum_threshold、autovacuum_vacuum_scale_factor等参数,可以更精确地控制何时启动自动VACUUM。

• 考虑使用VACUUM FULL的情况:虽然VACUUM FULL可以最大程度地释放磁盘空间,但由于其可能导致表锁定且执行耗时较长,因此建议在业务低峰期执行,并非作为日常维护工具。

• 监控Vacuum活动:利用pg_stat_user_tables视图或其他监控工具,了解Vacuum操作的状态和效果,以便及时调整相关参数。

总结

PostgreSQL的VACUUM是数据库维护和性能优化的重要组成部分,正确理解和运用VACUUM命令及其变种,对于保持数据库的良好运行状态具有重要意义。同时,随着数据库技术的发展和PostgreSQL新特性的引入,例如FREEZE窗口期、并行Vacuum等,VACUUM在处理大型数据集时的效率也在不断提升。

感谢观看,本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。

参考学习视频:【云贝教育】PostgreSQL分享课:AUTOVACCUM技术讲解

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

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

相关文章

视频监控汇聚管理系统EasyCVR平台RTMP推流异常是什么原因?

AI视频智能分析/视频监控管理平台EasyCVR能在复杂的网络环境中(专网、内网、局域网、广域网、公网等),支持设备通过4G、5G、WIFI、有线等方式接入,并将设备进行统一集中接入与视频汇聚管理,经平台接入的视频流能实现多…

无人机自动返航算法部署与飞行控制实践

一、环境准备 无人机硬件:确保你有一台支持自定义飞行控制的无人机,通常配备有Pixhawk或其他类似的飞行控制器。 地面站软件:安装如Mission Planner或QGroundControl等地面站软件,用于配置无人机参数和上传飞行控制代码。 编程环…

基于Python flask 的豆瓣电影排行榜,豆瓣电影评分可视化,豆瓣电影评分预测系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅&…

1+x中级题目练习复盘(四)

顺序存储较链式存储节省空间、查找性能高、插入和删除性能低。 <ALL表示小于最小 大于ANY表示大于最小值 LEFT OUTER JOIN 等同于LEFT JOIN INNER 和OUTER 不能同时出现 Before注解的方法在每个测试方法执行之前都要执行一次 一个Lambda表达式由以下三部分组…

什么软件可以剪辑录音?录音剪辑推荐3款工具

随着数字技术的发展&#xff0c;录音已经成为我们日常生活和工作中不可或缺的一部分。无论是会议记录、课堂笔记&#xff0c;还是音乐创作、语音聊天&#xff0c;我们都需要用到录音功能。然而&#xff0c;单纯的录音往往不能满足我们的需求&#xff0c;我们还需要对录音进行剪…

cesium-可视化区域分析

全部代码 <template><div id="cesiumContainer" style="height: 100vh;"></div><div id="toolbar" style="position: fixed;top:20px;left:220px;"><el-breadcrumb :separator-icon="ArrowRight&quo…

外卖小程序-购物车模块表结构设计和后端代码

表结构设计 添加购物车代码 Service public class ShoppingCartServiceImpl implements ShoppingCartService {Autowiredprivate ShoppingCartMapper shoppingCartMapper;Autowiredprivate DishMapper dishMapper;Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物…

【C#】KeyDown事件不被触发的问题。

在c#的winform工程中&#xff0c;可能会遇到创建了一个对话框&#xff0c;该对话框内包含了控件作为这个对话框的一部分。软件运行时&#xff0c;键盘输入按键&#xff0c;却没有办法触发对话框的KeyDown事件。是不是很奇怪呢&#xff1f; 首先要明白&#xff1a;主对话…

MySQL--执行一条 select 语句,期间发生了什么?

执行一条 SQL 查询语句&#xff0c;期间发生了什么&#xff1f; 连接器&#xff1a;建立连接&#xff0c;管理连接、校验用户身份&#xff1b;查询缓存&#xff1a;查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行。MySQL 8.0 已删除该模块&#xff1b;解析 …

Vue.js+SpringBoot开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

Linux命令:dmesg命令

目录 1 dmesg命令1.1 简介1.2 说明1.3 案例1、显示所有内核消息2、实时监控新消息3、显示特定级别的消息4、将消息输出到文件5、搜索包含特定字符串的被检测到的硬件6、将开机信息发邮件7、打印并清除内核环形缓冲区 总结 1 dmesg命令 1.1 简介 dmesg 命令在 Linux 系统中用于…

Lord 3DMCV7-AHRS 时间同步硬件触发设置

目的:通过FPGA发送脉冲触发IMU采集数据。FPGA发送脉冲时,IMU才有数据产生。 FPGA与IMU的硬件接线就不讲了,这里主要说明的是IMU的设置以及ROS驱动的config文件更改。 1. WIN上位机设置 通过IMU在WINDOWS的上位机SensorConnect对IMU的GPIO、波特率等基本功能进行设值,具体…

通过spring boot/redis/aspect 防止表单重复提交【防抖】

一、啥是防抖 所谓防抖&#xff0c;一是防用户手抖&#xff0c;二是防网络抖动。在Web系统中&#xff0c;表单提交是一个非常常见的功能&#xff0c;如果不加控制&#xff0c;容易因为用户的误操作或网络延迟导致同一请求被发送多次&#xff0c;进而生成重复的数据记录。要针…

用pyecharts的overlap绘制叠加图时,设置的颜色不起作用

问题 用pyecharts绘制叠加图时&#xff0c;如折线图上叠加散点图时&#xff0c;分别设置了自己的颜色&#xff08;三角是绿色&#xff0c;圆形是蓝色&#xff09;&#xff0c;但是渲染颜色和图例颜色不一致&#xff0c;如下图所示&#xff0c;折线颜色和散点颜色相同。 解决…

Leet code 904 水果成篮

解题思路&#xff1a;滑动窗口 创建hash表记录水果的种类和数量 两个指针left 和 right 从数组起始位置开始滑动&#xff0c;right在循环内 hash[fruits[right]] 进窗口 然后判断 hash表中的种类是否大于2 一旦大于2就要想办法出窗口 出窗口需要将hash表中种类重回2种 …

python做筛子用

import randomdef roll_dice():roll random.randint(1,10)return roll def main():total_times 100#初始化列表result_list[0]*10for i in range(total_times):print(roll_dice())for j in range(1,11):if roll_dice() j:result_list[j-1] 1if __name__ __main__:main() 结…

基于Java (spring-boot)的个人博客系统

一、项目介绍 登录模块&#xff1a;用户登录、用户注册 普通用户&#xff1a;博客主页、博客随笔、博客留言、个人信息修改 管理员&#xff1a;系统管理、内容管理、文章管理、随笔管理、分类管理、标签管理、留言管理、评论管理、文件管理 博客编辑&#xff1a;支持富文本编辑…

Autosar教程-Mcal教程-Fls配置教程

3.11.1 FLS基础知识 flash操作中有两个术语:block和page。block是flash最小的擦除单位,page则是flash写入的最小单位。以我们使用的F1KM-S4(R7F7016533)来说,它的是64 bytes, page是4bytes。这也就意味着,如果要擦除的话,最小要擦除64 bytes,但是写入可以按4字节的大小写入…

程序员的知识宝库,100+开源书籍、文档

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识&#xff0c;也有全栈交流学习摸鱼群&#xff0c;期待您的关注! 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0…

每日五道java面试题之springMVC篇(四)

目录&#xff1a; 第一题. Spring MVC怎么样设定重定向和转发的&#xff1f;第二题.Spring MVC怎么和AJAX相互调用的&#xff1f;第三题. 如何解决POST请求中文乱码问题&#xff0c;GET的又如何处理呢&#xff1f;第四题. Spring MVC的异常处理&#xff1f;第五题. 如果在拦截请…