为何清空并清理后的Postgres RDS空表仍占用1.4GB空间?
AWS RDS Postgres删空表后空间没释放?试试这些办法
先搞清楚空间到底花在哪了
先拆分总占用空间,明确是表本身、索引还是TOAST大字段表占的:
SELECT pg_size_pretty(pg_relation_size('"schema_name"."table_name"')) AS 表本身大小, pg_size_pretty(pg_indexes_size('"schema_name"."table_name"')) AS 索引总大小, pg_size_pretty(pg_total_relation_size('"schema_name"."table_name"') - pg_relation_size('"schema_name"."table_name"') - pg_indexes_size('"schema_name"."table_name"')) AS TOAST表大小;
针对性解决
如果是索引占的空间
删完表数据后,索引仍保留空结构,重建索引即可释放空间:
REINDEX TABLE "schema_name"."table_name";
若只需重建单个索引,用这句:
REINDEX INDEX "schema_name"."你的索引名";
如果是TOAST表占空间
TOAST表存储大字段,普通VACUUM不会回收它的空间,需执行FULL模式:
VACUUM FULL "schema_name"."table_name";
⚠️ 注意:VACUUM FULL会锁表,务必在业务低峰期执行;同时RDS实例需预留足够临时空间,至少为表大小的1.5倍。
如果是表本身空间没释放
普通VACUUM仅标记空间可复用,不会归还操作系统。若不想用锁表的VACUUM FULL,可尝试:
-- 原表改名 ALTER TABLE "schema_name"."table_name" RENAME TO "table_name_old"; -- 新建结构完全一致的空表 CREATE TABLE "schema_name"."table_name" (LIKE "schema_name"."table_name_old" INCLUDING ALL); -- 删除旧表释放空间 DROP TABLE "schema_name"."table_name_old";
这种方式锁表时间极短,适合业务繁忙场景。
最后验证
再执行原查询确认空间是否下降:
SELECT pg_size_pretty(pg_total_relation_size('"schema_name"."table_name"'));
内容的提问来源于stack exchange,提问作者Prachi
相关产品推荐
相关产品推荐

