尽管没有条目,Postgresql分区表仍在使用空间

尽管没有条目,Postgresql分区表仍在使用空间

问题描述:

我们最近用两千万行对主表进行了分区。该表由“id范围”分区。在该主表下创建7个子表,并且在插入期间条目将进入子表。所有这些都由pg_partman扩展管理。尽管没有条目,Postgresql分区表仍在使用空间

运行此查询时,主表显示占用大约300GB的磁盘空间。这很奇怪,因为这个表没有条目,我可以通过运行check_parent()函数来确认。

SELECT nspname || '.' || relname AS "relation",pg_size_pretty(pg_relation_size(C.oid)) AS "size" FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) 
WHERE nspname NOT IN ('pg_catalog', 'information_schema') ORDER BY pg_relation_size(C.oid) DESC LIMIT 30; 

我们从来没有遇到过这个问题,因为在其他环境中分区的时候,数据并不多。这可能是由于分区过程中未释放的磁盘空间?

是的,这肯定是由于未发布的磁盘空间。在将数据移动到不同的结构(如分区表)后,您应该执行VACUUM FULL

PostgreSQL一般不会自动释放表空间。正常(自动)VACUUM ANALYZE维护数据库,但不收缩磁盘上的表。但是,VACUUM FULL会锁定表格,因此请小心在正常运行时间内不要运行它。