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种查找)、与数据结构(数组/链表/栈与队列/树)整理总结

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

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

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

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

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

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

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

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

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

LLM实施的五个阶段

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

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

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

Vue3+ts(day02:CompositionAPI、setup)

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

备忘录怎么导出数据 备忘录数据导出方法

在忙碌的生活中,我时常依赖于备忘录来记录重要的信息,从工作截止日期到生活琐事,无一不靠它来帮我分担记忆的压力。但随着时间的推移,我发现有时候我不仅仅需要在软件内查看这些信息,还需要将它们导出,或许…

【数据库】软件测试之MySQL数据库练习题目

有表如下: Student 学生表 SC 成绩表 Course 课程表 Teacher 老师表 每个学生可以学习多门课程,每一个课程都有得分,每一门课程都有老师来教,一个老师可以教多个学生 1、查询姓‘朱’的学生名单 select * from Student whe…

【深度学习笔记】优化算法——Adam算法

Adam算法 🏷sec_adam 本章我们已经学习了许多有效优化的技术。 在本节讨论之前,我们先详细回顾一下这些技术: 在 :numref:sec_sgd中,我们学习了:随机梯度下降在解决优化问题时比梯度下降更有效。在 :numref:sec_min…

力扣--动态规划5.最长回文子串

class Solution { public:string longestPalindrome(string s) {// 获取输入字符串的长度int n s.size();// 如果字符串长度为1,直接返回原字符串,因为任何单个字符都是回文串if (n 1)return s;// 创建一个二维数组dp,用于记录子串是否为回…

React-路由小知识

1.默认路由 说明:当访问的是一级路由时,默认的二级路由组件可以得到渲染,只需要在二级路由的位置去掉path,设置index.属性为true。 2.404路由 说明:当浏览器输入ul的路径在整个路由配置中都找不到对应的pth,为了用户体验&#x…

《农商网》商业计划书(附模板下载)

在当今互联网高速发展的时代,农业与电子商务的结合成为了新的经济增长点。《农商网》商业计划书详细阐述了一个以大学生创业为核心的创新项目,旨在通过打造一个全新的农产品在线交易平台,实现农产品的高效流通和价值最大化。该计划书首先对市…

amv是什么文件格式?如何播放amv视频?

AMV文件格式源自于中国公司Actions Semiconductor,最初作为其MP4播放器中使用的专有视频格式。产生于数码媒体发展的需求下,AMV格式为小屏幕便携设备提供了一种高度压缩的视频存储方案。 AMV文件格式的主要特性与使用场景 AMV格式以其独特的特性在小尺寸…