我们最近分区了一个包含数百万行的主表。该表由“id范围”分区。在此主表下创建了7个子表,并且在插入期间条目将进入子表。所有这些都由pg_partman扩展程序管理。
运行此查询时,主表显示占用大约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;
我们从未在其他环境中对此表进行分区时遇到此问题,而其他环境中的数据并不多。这可能是由于分区期间未释放的磁盘空间造成的吗?
答案 0 :(得分:0)
是的,这肯定是由于未发布的磁盘空间。在将数据移动到不同的结构(如分区表)之后,您应该执行VACUUM FULL
。
PostgreSQL通常不会自动释放表空间。正常(自动)VACUUM ANALYZE
维护数据库但不收缩磁盘上的表。但是VACUUM FULL
会锁定表格,因此请注意不要在正常操作时间内运行它。