第一步:查询哪些表占用空间太大:

--数据库中单个表的大小(不包含索引)
select pg_size_pretty(pg_relation_size('表名'));

--查出所有表(包含索引)并排序
SELECT table_schema || '.' || table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC limit 20

--查出表大小按大小排序并分离data与index
SELECT
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,
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
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes

第二:使用VACUUM对表空间进行回收

vacuum table_xx

名称

VACUUM -- 垃圾收集以及可选地分析一个数据库

语法

VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]

描述

VACUUM 回收已删除行占据的存储空间。在一般的 PostgreSQL 操作里,那些已经 DELETE 的行或者被 UPDATE 过后过时的行并没有从它们所属的表中物理删除;在完成 VACUUM 之前它们仍然存在。因此有必须周期地运行 VACUUM ,特别是在经常更新的表上。

如果没有参数,VACUUM 处理当前数据库里每个表,如果有参数,VACUUM 只处理那个表。

VACUUM ANALYZE 先执行一个 VACUUM 然后是给每个选定的表执行一个 ANALYZE 。对于日常维护脚本而言,这是一个很方便的组合。参阅 ANALYZE 获取更多有关其处理的细节。

简单的 VACUUM(没有 FULL)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL 执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排它锁。

参数

FULL

选择"完全"清理,这样可以恢复更多的空间,但是花的时间更多并且在表上施加了排它锁。

FREEZE

选择激进的行"冻结"。指定 FREEZE 相当于执行 VACUUM 时将 vacuum_freeze_min_age 参数设为零。FREEZE 选项将在未来的版本中被取消,并且反对使用,你应当使用设置正确的参数值的方法来达到目的。

VERBOSE

为每个表打印一份详细的清理工作报告

ANALYZE

更新用于优化器的统计信息,以决定执行查询的最有效方法。

table

要清理的表的名称(可以有模式修饰)。缺省时是当前数据库中的所有表。

column

要分析的具体的字段名称。缺省是所有字段。

输出

如果指定了 VERBOSE ,那么 VACUUM 将发出处理过程中的信息,以表明当前正在处理那个表。各种有关这些表的统计也会打印出来。

注意

VACUUM 不能在事务块内执行。

SQL 标准里没有 VACUUM 语句。

建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行 VACUUM ANALYZE 命令是一个很好的习惯。这样做将更新系统目录为最近的更改,并且允许 PostgreSQL 查询优化器在规划用户查询时有更好的选择。

不建议日常使用 FULL 选项,但是可以在特殊情况下使用。一个例子就是在你删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL 通常要比单纯的 VACUUM 收缩更多的表尺寸。FULL 选项并不清理索引。仍然推荐周期性的运行 REINDEX 命令。实际上,首先删除所有索引,再运行 VACUUM FULL 命令,最后重建索引通常是很快的。

VACUUM 导致 I/O 流量增加,可能会导致其它活动会话的性能恶劣。因此,有时候会建议使用基于开销的 vacuum 延迟特性。参阅节17.4.4获取细节。

PostgreSQL 包含一个"autovacuum"设施,它可以自动进行日常的 vacuum 维护,默认是关闭的。关于手动和自动清理的更多细节,参见节22.1

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐