PostgreSQL 表膨胀原因和解决方案

news/2024/7/9 22:47:31 标签: postgresql, 数据库, 表膨胀

在 PostgreSQL 中,表膨胀是一个常见的问题,它会导致数据库性能下降,甚至在极端情况下会耗尽磁盘空间。了解表膨胀的原因及其解决方案,对于维护数据库性能和稳定性至关重要。

表膨胀的原因

MVCC (多版本并发控制)

PostgreSQL 使用 MVCC 机制来处理并发访问,允许读取操作在不锁定表的情况下进行,从而提高了并发性能。当一条记录被更新或删除时,原始记录不会立即从磁盘上移除。相反,它会被标记为不可见,而新的记录(在更新的情况下)会被添加到表中。这意味着随着时间的推移,如果不进行适当的维护,表上的“死”行会不断累积,从而导致表膨胀

频繁的更新和删除操作

频繁的更新和删除操作直接导致了表中大量的“死”行。在高更新和删除率的环境中,表膨胀尤为严重,因为每次这些操作发生时,都会留下不再可达的行。

查看表占用空间

如下SQL可以查询当前数据库中以 a_ 开头的表所占用的空间

-- 查出表大小按大小含索引
SELECT
short_name,
"table_name",
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_name,
short_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name,
table_name as short_name,
table_schema
FROM information_schema.tables
) AS all_tables
where 
table_schema='public'
AND all_tables.short_name like 'a_%'
ORDER BY total_size DESC
) AS pretty_sizes

解决方案

解决表膨胀问题通常涉及到以下几个步骤:

  1. 定期执行VACUUM FULL
    VACUUM FULL是PostgreSQL中用于收缩表和回收空间的有效手段,它不仅会删除废弃的元组,还会对剩余的数据进行重新排列,以消除表中的空洞。但是,这个操作会锁定整个表,因此在高并发场景下需谨慎使用,并尽量在业务低峰期执行。

  2. 启用自动 Vacuuming PostgreSQL 提供了autovacuum机制,可以根据阈值自动触发vacuum操作。合理配置autovacuum参数如autovacuum_vacuum_thresholdautovacuum_vacuum_scale_factor等,确保在合适的时间点进行垃圾回收。

  3. 使用ANALYZE 在vacuum之后,建议执行ANALYZE命令,以便更新统计信息,优化查询计划,提升查询性能。

  4. 考虑合理的表设计 对于频繁更新的大表,可以考虑分区表、分片策略,以及合理设置填充因子(fillfactor),减少行迁移和空间碎片。

  5. 监控与预警 建立健全的数据库监控体系,对表的膨胀情况进行实时监测并设置阈值告警,一旦发现表膨胀现象,能快速响应处理。

总之,理解并有效管理PostgreSQL表膨胀问题,不仅能节省存储资源,更能保证数据库系统的稳定性和高效性。通过适时调整系统参数、合理规划运维策略以及持续优化表结构设计,可从根本上解决表膨胀带来的挑战。


http://www.niftyadmin.cn/n/5470645.html

相关文章

探索口腔系统功能架构的演变与未来

随着医疗技术的不断发展和人们对口腔健康的重视,口腔系统的功能架构也在不断演变。从传统的口腔诊疗到数字化的口腔健康管理,口腔系统的功能框架正在经历着翻天覆地的变化。本文将深入探讨口腔系统功能架构的演变历程以及未来发展趋势。 --- 随着社会的…

『VUE』11. 操作数组的方法(详细图文注释)

目录 vue中操作数组的方法会修改原数组的 会进行渲染更新不修改原数组的 不会进行渲染更新 push自动渲染concat 赋值渲染总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 vue中操作数组的方法 vue中数组数据呈现在网页,只检测…

window中如何在Anaconda虚拟环境中安装compressai

1, 进入CompressAI的Github代码页下载压缩包并解压到自己的项目路径 2,打开anaconda的prompt命令行,激活需要安装的虚拟环境,然后进入compressai文件夹,比如下操作: 3,输出安装命令行 pip install -e . -…

Linux的学习之路:4、权限

一、Linux权限的概念 权限我们都熟悉,最常见的就是在看电视时需要vip这个就是权限,然后在Linux就是有两个权限,就是管理员也就是超级用户和普通的用户 命令:su [用户名] 功能:切换用户。 例如,要从root用户…

在一套Dockerfile中完成编译和运行环境部署

大纲 解释型语言编译环境解释环境编译型语言编译环境运行环境 方法编译环境安装系统安装编译依赖下载代码特殊处理(可以忽略)编译准备(可以忽略)编译打包依赖(编译结果) 运行环境安装操作系统安装运行时依赖…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

每日五道java面试题之ZooKeeper篇(一)

目录: 第一题. ZooKeeper 是什么?第二题. Zookeeper 文件系统第三题. Zookeeper 怎么保证主从节点的状态同步?第四题. 四种类型的数据节点 Znode第五题 . Zookeeper Watcher 机制 – 数据变更通知 第一题. ZooKeeper 是什么? Zoo…

xss相关知识点与绕过思路总结

前言 对xss的绕过进行了系统的学习与实践后,重新审视一下xss,对他的绕过进行一个总结。 (当然我也是个小白,这些也是我当时瞎鸡儿乱搞绕过了几个xss自己做的小总结) 可能有点丑陋,献丑了。 好博客推荐 …