PostgreSQL 数据库查看表占用空间

最近项目中遇到数据库表存储空间被占满的情况。因为是开发环境,所以想着数据量应该不会很多,可能是一些大表操作 DELETE 没有把空间释放的原因。所以想着查看哪些表占用了多少空间,然后把哪些占用空间大的表 truncate 掉。

查询语句:

1
2
3
4
5
6
7
8
-- 数据库中单个表的大小(不包含索引)
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

说明:

delete 表全部记录,其实表空间还是没释放的,可以使用 truncate table xxx

PG 数据库有个 VACUUM 功能,能够释放空间,使用语法:

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

VACUUM 和 FULL VACUUM 区别:

VACUUM 只是将删除状态的空间释放掉,转换到能够重新使用的状态,但是对于系统来说该数据块的空闲空间并没有反应到系统的元数据中。类似 Oracle 中高水位标记并没有下降。FULL VACUUM 将会使空间释放的信息表现在系统级别,其实质是将当前删除记录后面的数据进行移动,使得整体的记录连贯起来,降低了“高水位标记”。