You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何清空并清理后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:46:06