postgresql清理表空间

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: postgresql清理表空间

前言

最近在用postgresql查询数据的时候,发现有个表的查询一直很慢,这里暂且取名A表,但是数据量并没有特别大,才几万的数据量,而且发现跟这个表同schema的数据表有个几千万的,但是查询都比这个A表快很多。后来查找了一系列资料发现,是A表占用的空间太大,会影响查询的性能,使用命令查看发现大概有4G左右的磁盘查勇,而几千万的那个表占用空间才几百M,于是使用命令清理了A表的磁盘占用,处理完之后就几十M的空间,而且查询变得很快。

处理步骤

1.查看表占用空间大小

pg里面查看表空间大小有好几种方式,如下:

1.1 \dt+ 命令

这是 psql 命令行中的命令,可以列出所有表及其大小信息, 如:

 postgres=# \dt+ t1
             List of relations
 Schema |   Name   | Type |  Owner  | Size | Description 
 --------+--------------+-------+-----------+-------+-------------
 public | t1      | table | postgres | 16 MB |

1.2 pg_total_relation_size() 函数

这个函数可以直接查询一个表的大小,如:

 sql
 SELECT pg_total_relation_size('t1');

1.3 pg_size_pretty() 函数

这个函数可以将字节大小转换为人类比较方便阅读的模式:

 sql
 SELECT pg_size_pretty(pg_total_relation_size('t1'));
 输出:
 16MB

2.清理磁盘空间

VACUUM FULL 是 PostgreSQL 中的一个命令,用于对表进行完整的垃圾回收和碎片整理。

VACUUM FULL 命令会做以下操作:

2.1 完整回收未使用的空间

普通的 VACUUM 命令只会回收此刻可以回收的空间,但有些空间必须等到事务结束才可以回收。VACUUM FULL 会等待所有事务结束,彻底回收所有未使用空间。

2.2 重写表数据

VACUUM FULL 会重写表中的每一行,整理存储碎片,压缩表空间。

2.3 重建索引

VACUUM FULL 会重建表所有的索引,整理索引碎片并压缩索引空间。

2.4 更新统计信息

VACUUM FULL 会重新计算表的统计信息, 包括行数、空间大小等。

2.5 清理回滚段

VACUUM FULL 会缩小和清空回滚段,释放更多空间。

注:使用VACUUM FULL或者VACUUM不会锁表

所以VACUUM FULL 应该谨慎执行, 最好是业务比较空间的时候执行,一般建议每隔几个月执行一次。

总结

1.数据表在频繁的更新,写入,删除等操作会产生大量的磁盘碎片导致性能下降,使用VACUUM或者VACUUM FULL可以清理掉多余的空间

2.不过要注意因为VACUUM FULL本身清理也会有较大的性能消耗,而且会锁表,所以使用的时候要谨慎,不要在业务频繁调用的时候清理

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
3月前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL从小白到高手教程 - 第41讲:postgres表空间备份与恢复
PostgreSQL从小白到高手教程 - 第41讲:postgres表空间备份与恢复
138 1
|
10月前
|
Oracle 安全 关系型数据库
如何在openGauss/PostgreSQL手动清理XLOG/WAL 文件?
openGauss/PostgreSQL中的预写式日志WAL(Write Ahead Log),又名Xlog或redo log,相当于oracle的online redo log, 不同的是oracle online redo log是提前创建几组滚动使用,但在opengauss中只需要本配置参数控制WAL日志的周期,数据库会一直的创建并自动清理,但存在一些情况WAL日志未清理导致目录空间耗尽,或目录空间紧张时手动删除wal日志时,比如如何确认在非归档模式下哪些WAL日志文件可以安全删除?
573 0
|
8月前
|
存储 关系型数据库 数据库
PostgreSQL 中,表空间
PostgreSQL 中,表空间
86 1
|
8月前
|
安全 关系型数据库 数据库
创建 PostgreSQL 表空间时没有指定空间的总大小
创建 PostgreSQL 表空间时没有指定空间的总大小
96 1
|
关系型数据库 数据库 PostgreSQL
PostgreSQL的DB在表空间之间迁移
Background The  /data/01 disk space is insufficient, but /data/02 is sufficient, so we migrate some data to /data/02.
1546 0
|
存储 关系型数据库 数据库
|
存储 大数据 关系型数据库
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 22 章 管理数据库_22.6. 表空间
22.6. 表空间 PostgreSQL中的表空间允许数据库管理员在文件系统中定义用来存放表示数据库对象的文件的位置。一旦被创建,表空间就可以在创建数据库对象时通过名称引用。 通过使用表空间,管理员可以控制一个PostgreSQL安装的磁盘布局。
1313 0
|
存储 关系型数据库 数据库
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 19 章 服务器配置_19.10. 自动清理
19.10. 自动清理 这些设置控制自动清理特性的行为。 详情请见第 24.1.6 节。请注意在每个表基础上可以重写这些设置; 参阅存储参数。 autovacuum (boolean) 控制服务器是否运行自动清理启动器后台进程。
1306 0
|
关系型数据库 PostgreSQL 数据库