大量删除行后进行的空间分析不会在Postgres中释放空间

4

我在我们的PostgreSQL数据库中删除了大量的行,并随后运行了vacuum analyze。

我注意到在AWS RDS控制台中磁盘使用情况并没有太多变化。

根据查询结果,表格大小也没有太大变化。

SELECT *, pg_size_pretty(total_bytes) AS total
    , pg_size_pretty(index_bytes) AS INDEX
    , pg_size_pretty(toast_bytes) AS toast
    , pg_size_pretty(table_bytes) AS TABLE
  FROM (
  SELECT *, total_bytes-index_bytes-COALESCE(toast_bytes,0) AS table_bytes FROM (
      SELECT c.oid,nspname AS table_schema, relname AS TABLE_NAME
              , c.reltuples AS row_estimate
              , pg_total_relation_size(c.oid) AS total_bytes
              , pg_indexes_size(c.oid) AS index_bytes
              , pg_total_relation_size(reltoastrelid) AS toast_bytes
          FROM pg_class c
          LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
          WHERE relkind = 'r'
  ) a
) a order by total_bytes desc;

这正常吗?还是磁盘空间根本没有被回收?
1个回答

8

VACUUM用于清理被删除的元组占用的存储空间,它标记表文件和索引中的空间可供重用,但不会释放磁盘空间。

我认为你需要的是一条命令,可以重写整个表和索引,同时只保留真实存在的数据。这就是CLUSTER、VACUUM FULL或ALTER TABLE的某些形式所做的工作。如果按某种顺序进行聚簇操作有助于提高性能,那么现在是一个很好的时间。

然而,它会锁定表,因此除非表很小且可以容忍几秒钟的停机时间,否则不要在需要不间断访问的生产服务器上执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接