PostgreSQL数据优化——死元组清理

最近遇到一个奇怪的问题,一个百万级的PostgreSQL表,只有3个索引。但是每次执行insert或update语句就要几百ms以上。经过查询发现是一个狠简单的问题,数据库表死元组太多了,需要手动清理。

在 PG 中,update/delete 语句的实现通过 MVCC 机制的多版本链实现。如下图所示,更新一条元组时,会将原来的元组标记,并新增一条元组。后续的事物通过快照来判断元组的可见性。

对于一条已经被更新/删除的元组来说,当这条元组对所有事物都不可见后,它的存在就没有意义了,理应被删除,对于这种元组,我们称之为“死元组”。当一张表有大量更新/删除时,如果不做清理的话,表里面就会积攒很多这样的“死元组”,占用大量的空间,造成表空间膨胀。

一、清理前

  • 查询死元组数量SQL
SELECTc.relname 表名,(current_setting('autovacuum_analyze_threshold')::NUMERIC(12,4))+(current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12,4))*reltuples AS 自动分析阈值,(current_setting('autovacuum_vacuum_threshold')::NUMERIC(12,4))+(current_setting('autovacuum_vacuum_scale_factor')::NUMERIC(12,4))*reltuples AS 自动清理阈值,reltuples::DECIMAL(19,0) 活元组数,n_dead_tup::DECIMAL(19,0) 死元组数
FROMpg_class c LEFT JOIN pg_stat_all_tables dON C.relname = d.relname
WHEREc.relname ='你要查询的表名'  AND reltuples > 0AND n_dead_tup > (current_setting('autovacuum_analyze_threshold')::NUMERIC(12,4))+(current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12,4))*reltuples;

查询结果

  • 此时的数据库插入耗时测试,执行update语句

Affected rows: 1
时间: 1.371s

二、配置自动清理

AUTOVACUUM:自动清理元组。开启自动清理后,PostgreSQL会在合适的时候自动执行VACUUM操作。

-- 查看当前autovacuum的状态
SHOW autovacuum;-- 开启autovacuum
SET autovacuum = on;

三、使用VACUUM手动清理

自动清理,有时候可能由于参数配置,效果不佳。可以使用VACUUM命令手动清理,注意,清理过程中会锁表

VACUUM FULL VERBOSE 模式名.表名;
VACUUM FULL VERBOSE ANALYZE 模式名.表名;

清理效果图
清理后update效果

Affected rows: 1
时间: 0.427s

四、查询历史清理信息

SELECTrelname 表名,seq_scan 全表扫描次数,seq_tup_read 全表扫描记录数,idx_scan 索引扫描次数,idx_tup_fetch 索引扫描记录数,n_tup_ins 插入的条数,n_tup_upd 更新的条数,n_tup_del 删除的条数,n_tup_hot_upd 热更新条数,n_live_tup 活动元组估计数,n_dead_tup 死亡元组估计数,last_vacuum 最后一次手动清理时间,last_autovacuum 最后一次自动清理时间,last_analyze 最后一次手动分析时间,last_autoanalyze 最后一次自动分析时间,vacuum_count 手动清理的次数,autovacuum_count 自动清理的次数,analyze_count 手动分析此表的次数,autoanalyze_count 自动分析此表的次数,( CASE WHEN n_live_tup > 0 THEN n_dead_tup :: float8 / n_live_tup :: float8 ELSE 0 END ) :: NUMERIC ( 12, 2 ) AS "死/活元组的比例"
FROMpg_stat_all_tables
WHEREschemaname = 'public'
ORDER BY n_dead_tup::float8 DESC;

清理结果

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

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

相关文章

SQL: 触发器/存储过程/游标的操作

目录 触发器存储过程创建存储过程修改存储过程删除存储过程执行存储过程 游标待续、更新中 触发器 待更新存储过程 定义 是一组TSQL语句的预编译集合,能实现特定的功能 是一种独立的数据库对象,在服务器上创建和运行 类似于编程语言中的过程或函数分类…

Redis精讲

redis持久化 RDB方式 Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中. 快照文件称为RDB文件, 默认是保存在当前运行目录. [rootcentos-zyw ~]# docker exec -it redis redis-cli 127.0.0.1:6379> sav…

开源的python 游戏开发库介绍

本文将为您详细讲解开源的 Python 游戏开发库,以及它们的特点、区别和应用场景。Python 社区提供了多种游戏开发库,这些库可以帮助您在 Python 应用程序中实现游戏逻辑、图形渲染、声音处理等功能。 1. Pygame 特点 - 基于 Python 的游戏开发库。…

算法(6种思想、7种查找)、与数据结构(数组/链表/栈与队列/树)整理总结

算法 除了这里提到的算法思想和查找算法,算法还有别的类型: 排序算法: 对一组元素进行排序的算法。常见的排序算法包括冒泡排序、快速排序、归并排序等。 图算法: 解决图结构相关问题的算法,例如最短路径问题、最小…

Printer Queue(UVA 12100)

网址如下&#xff1a; Printer Queue - UVA 12100 - Virtual Judge (vjudge.net) &#xff08;第三方网站&#xff09; 很简单的一道队列题&#xff0c;模拟一下就可以了 但是我觉得我可以优化一下算法 然而要上高数了 代码如下&#xff1a; #include<queue> #inclu…

《操作系统》的同步、通信与死锁

基础概念 同步 进程互斥&#xff1a;若干进程因相互争夺独占型资源而产生的竞争关系&#xff0c;具有唯一排它性&#xff0c;互斥无法限制访问者对资源的访问顺序&#xff0c;即访问是无序的。 进程同步&#xff1a;我们把异步环境下的一组并发进程因直接制约而互相发送消息…

二叉树的中序遍历

题目描述 现有一棵n个结点的二叉树&#xff08;结点编号为从0到n-1&#xff0c;根结点为0号结点&#xff09;&#xff0c;求这棵二叉树的中序遍历序列。 输入描述 第一行一个整数n​​​​​​​​&#xff08;1≤n≤50​​​​​​​​​​​&#xff09;&#xff0c;表示二…

Docker容器Docker桌面配置镜像加速

打开Docker Desktop应用程序&#xff0c;点击设置 具体配置如下&#xff1a; {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"features": {"buil…

编译Linux内核并修改版本号后缀为学号-Ubuntu22.04中编译安装Linux内核6.7.8

前言&#xff1a;实验课要求下载最新版本Linux内核并修改版本号&#xff0c;本人在Vmware中Ubuntu22.04中实现&#xff0c;花三天时间查阅大量网站资料。记录一下误打误撞成功的过程&#xff0c;希望对你们有帮助。 目录 一、常规安装步骤&猜想Ubuntu与gcc版本过低 二、安…

202003 青少年软件编程(Scratch)等级考试试卷(一级)

202003 青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;一级&#xff09; 第1题&#xff1a;【 单选题】 在Scratch中&#xff0c;以下哪个区域可以展示编程效果&#xff1f; A:代码区 B:舞台区 C:角色区 D:积木区 【正确答案】: B 【试题解析】…

基于PySide2实现调用本地摄像头抓拍并保存照片(Python版本)

因为横向课题需要&#xff0c;这是其中的一个小小的功能&#xff0c;单独拎出来作为一个小demo&#xff0c;方便后续学习使用 项目实现功能&#xff1a; 点击open按钮&#xff0c;摄像头开启&#xff0c;实时捕获周围图像并显示 点击capture按钮&#xff0c;保存摄像头照片&am…

日期工具的逻辑与数据请求函数的完善

src\libs\utils.js 获取当前日期格式 /*** 获取当前日期格式* param {*} field * returns */ function getNowDate(field) {const date new Date()let year date.getFullYear(),month date.getMonth() 1,day date.getDate()switch (field) {case day:return ${year}-${mo…

02- 使用Docker安装RabbitMQ

使用Docker安装RabbitMQ 下载安装镜像 方式一: 启动docker服务,然后在线拉取 # 在线拉取镜像 docker pull rabbitmq:3-management# 使用docker images查看是否已经成功拉取方式二: 从本地加载 ,将RabbitMQ上传到虚拟机中后使用命令加载镜像即可 docker load -i mq.tar启动M…

leetcode 第388场周赛第二题

这道题其实和第一题是很相似的&#xff0c;也是一种贪心的算法&#xff08;话说这周怎么都是贪心和暴力&#xff09; 简单来说就是对于happiness的数组进行排序&#xff0c;用一个变量记录就行了。 思路&#xff1a;对于数组从大到小排序&#xff0c;然后对于happiness[i]-i进…

LLM实施的五个阶段

原文地址&#xff1a;Five Stages Of LLM Implementation 大型语言模型显着提高了对话式人工智能系统的能力&#xff0c;实现了更自然和上下文感知的交互。这导致各个行业越来越多地采用人工智能驱动的聊天机器人和虚拟助手。 2024 年 2 月 20 日 介绍 从LLMs的市场采用情况可以…

【C++】每日一题 92 反转链表

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 class ListNode { public:int val;ListNode* next;ListNode(int _val) {val _val;next nullptr;} };…

AcWing 1211. 蚂蚁感冒

Problem: AcWing 1211. 蚂蚁感冒 文章目录 思路解题方法复杂度Code 思路 这是一个模拟题。题目的意思是&#xff0c;如果一只蚂蚁感冒了&#xff0c;那么它会把感冒传给所有和它相向而行的蚂蚁。所以我们只需要找出所有和第一只蚂蚁相向而行的蚂蚁就可以了。具体来说&#xff0…

vue中的性能优化

Vue.js 性能优化是提高应用性能和用户体验的关键之一。以下是一些常见的 Vue.js 性能优化方法&#xff1a; 使用 Vue Devtools 进行性能分析&#xff1a; Vue Devtools 是一个强大的浏览器扩展&#xff0c;可以帮助开发者实时监测 Vue 应用的性能指标、组件状态和数据流&#x…

LabelImg:一个简单易用的图像标注工具

目录 LabelImg是什么&#xff1f; 如何使用LabelImg进行图像标注&#xff1f; LabelImg的优势和应用场景 在哪里下载它 随着人工智能技术的不断发展&#xff0c;机器学习和深度学习在图像识别、目标检测等领域中得到了广泛的应用。而要训练一个有效的模型&#xff0c;通常需…

Vue3+ts(day02:CompositionAPI、setup)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…