首页 > 数据库 >postgresql 表膨胀及优化

postgresql 表膨胀及优化

时间:2023-11-17 14:06:11浏览次数:55  
标签:事务 full postgresql 删除 HEAPTUPLE vacuum 膨胀 优化

1.什么是表膨胀

表膨胀是指表的数据和索引所占文件系统的空间,在有效数据量并未发生大的变化的情况下,不断增大。久而久之,关系文件被大量空洞填满,浪费了大量的磁盘空间。甚至某些特殊场景下。一个表中只有一条简单的数据,但是表对应的物理文件可能已经达到M级甚至G级。

2.表膨胀危害

·空间持续上涨,到达某一个点后,需要执行一个高额代价的vacuum full(或者custer等可以重组表的命令),但vacuum full又是AccessExclusiveLock,最高级别的锁,会阻塞一切访问,意味着在完成清理重组之前,都无法访问该表。

·扫描的效率变低,即使所有记录都是dead状态,PostgreSQL的顺序扫描也会扫描对象所有的老版本,直到执行vacuum将dead的记录删除。

3.为什么会表膨胀

postgresql mvcc :写新数据时,旧数据不删除,而是把新数据插入,将旧数据标记为无效,PostgreSQL就是使用的这种实现方法,新老数据存放在一起,在被清理之前,会一直占据着空间,所以会导致膨胀。

4.表膨胀产生的原因

vacuumlazy.c 中的函数TransactionldPrecedes

用于判断两个事务的大小,xmax就是删除、更新时的事务ID,oldestXmin是活动事务中最小的事务ID。 这个函数的逻辑是,如果 oldestXmin< xmax,则返回 HEAPTUPLE RECENTLY DEAD,意味着保留此Tuple,不去进行删除。最关键的就是长事务。

如果系统中含有很久之前开启而未提交的事务,并且这个事务由于执行过更新,创建了事务ID,那么计算出来的OldestXmin会非常小,vacuum做上述这个判断时,结果通常为true,即返回HEAPTUPLE RECENTLY DEAD,这样就会保留此tuple(旧版本),导致回收无法完成,表膨胀由此发

typedef enum 元组的状态:

HEAPTUPLE_DEAD /* 元组是死的和可删除的 /

HEAPTUPLE_LIVE, / 元组处于活动状态 (已提交,没删除)/

HEAPTUPLE_RECENTLY_DEAD / 死元组,但是不能删除 */

HEAPTUPLE_INSERT_IN_PROGRESS /插入xact仍在进行中/

HEAPTUPLE_DELETE_IN_PROGRESS /*正在删除xact *

postgresql 表膨胀及优化_数据

5.表膨胀的优化建议

·一定要开启autovacuum。

·提高系统的IO能力,越高越好。

·设置idle in transaction session timeout参数,控制长事务的存活时间

·对于大表,建议使用分区,可以加快vacuum的速度。

·应用程序设计时,避免使用大批量的更新,删除操作,可以切分为多个事务进行。

6.普通的vacuum

·清除UPDATE或DELETE操作后留下的"死元组"

·跟踪表块中可用空间,更新free space map

·更新visibility map,index only scan以及后续vacuum都会利用到

·"冻结"表中的行,防止事务ID回卷

·配合ANALYZE,定期更新统计信息

7.vacuum full

vacuum full会对表进行重组,也就意味着表的oid会变,所以不能我们在日常操作中,要定位表的oid的时候,不能通过pg class的oid来找,得通过pgclass的relfilenode来找,这样才精确。而且,vacuum full最大会占据原来磁盘空间的两倍。

vacuum full或者cluster等可以重组表的方式,不过都是8级锁,access exclusive lock,会阻塞一切访问,重组表,意味着表在磁盘上的物理位置会发生改变,同时最多会使用两倍表空间的存储大小。

标签:事务,full,postgresql,删除,HEAPTUPLE,vacuum,膨胀,优化
From: https://blog.51cto.com/u_11103985/8441175

相关文章

  • CPU 程序性能优化
    一个程序首先要保证正确性,在保证正确性的基础上,性能也是一个重要的考量。要编写高性能的程序,第一,必须选择合适的算法和数据结构;第二,应该编写编译器能够有效优化以转换成高效可执行代码的源代码,要做到这一点,需要了解编译器的能力和限制;第三,要了解硬件的运行方式,针对硬件特性进行优......
  • MySQL数据库高并发优化配置
    在Apache,PHP,mysql的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验进......
  • 【C++】【图像处理】形态学处理(腐蚀、膨胀)算法解析(以.raw格式的图像为基础进行图像处
    1voiderosion(BYTE*image,intw,inth,BYTE*outImg)2{3intrept;4//腐蚀5memcpy(outImg,image,sizeof(BYTE)*w*h);//将读取的图像赋值给outImg,方便进行腐蚀操作67inti,j,m,n;8BYTEflag;9for(rept=0;rept......
  • 如何l利用`ThreadLocal`、`HandlerInterceptor`、`HandlerMethodArgumentResolver`来
    核心类ThreadLocal、HandlerInterceptor、HandlerMethodArgumentResolver1.ThreadLocal2.WebMvcConfigurer -addArgumentResolvers3.HandlerMethodArgumentResolver -supportsParameter -resolveArgumentThreadLocal:可以理解为一个线程安全的Map。//用户上下......
  • webpack配置优化
    Webpack是一个非常强大的模块打包器,用于处理和打包前端资产。随着项目的复杂性增加,配置文件和优化Webpack的性能就变得非常重要。以下是一些关于如何优化Webpack配置的策略:使用最新版本的Webpack:每个新版本的Webpack都可能包含性能改进和修复。确保你的项目使用的是最......
  • g2o(5-2)2d-3d BA优化
    https://github.com/gaoxia   #include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/features2d/features2d.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/calib3d/calib3d.hpp>#include<Eig......
  • g2o(5-3)3d-3d BA优化
    https://github.com/gaoxiang12/slambook/blob/master/ch7/pose_estimation_3d3d.cpp #include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/features2d/features2d.hpp>#include<opencv2/highgui/highgui.hpp>#include&l......
  • PostgreSQL技术大讲堂 - 第34讲:调优工具pgBagder部署
       PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第34讲:调优工具pgBagder部署 第34讲:11月18日(周六)......
  • 架构开发与优化咨询和实施服务
    服务概述    得益于硬件平台算力的提升,汽车电子电气架构的集成度逐渐提高,从单体ECU、到功能域集成控制器、到区域集成控制器,多域融合成为了目前行业中软件工程的重要工作内容。同时,在传统控制器C代码开发的基础上,C++、JAVA等高级别编程语言也得到了更多的应用。以典型的智......
  • 源码安装PostgreSQL
    准备工作更新系统。yum-yupdate安装依赖。yum-ygroupinstall"Developmenttools"yum-yinstallreadline-devel源码安装PostgreSQL创建postgres用户。groupaddpostgresuseradd-gpostgrespostgres创建安装目录并授权。mkdir-p/usr/local/postgres15.3......