0

我们最近对具有数百万行的主表进行了分区。此表按“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;

在其他数据不多的环境中对该表进行分区时,我们从未遇到过这个问题。这可能是由于分区期间未释放的磁盘空间造成的吗?

4

1 回答 1

0

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

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

于 2016-11-07T11:44:04.690 回答