在 postgres 中大量删除未释放 space 的行后进行真空分析
Vacuum analyze after huge deleting of rows not freeing space in postgres
我删除了我们 postgres 数据库中的大量行,然后 运行 稍后进行真空分析。
我注意到 AWS RDS 控制台中的磁盘使用量没有太大变化。
尝试了 运行 查询,基于 table 大小也没有太大变化。
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;
这正常吗?或者磁盘 space 根本没有被回收?
VACUUM 回收死元组占用的存储空间,也就是说,它将 table 文件和索引中的 space 标记为可重用,但不会释放磁盘 space.
我想你想要的是一个重写整个 table 和索引的命令,同时只保留真正存在的数据。那将是 CLUSTER,或 VACUUM FULL,或需要 table 重写的 ALTER TABLE 的一种形式。如果您的性能可以从特定顺序的聚类中获益,那么现在就是这样做的好时机。
虽然它会锁定 table,所以不要在需要不间断访问的实时服务器上执行此操作,除非 table 很小并且您可以忍受几秒钟的停机时间。
我删除了我们 postgres 数据库中的大量行,然后 运行 稍后进行真空分析。
我注意到 AWS RDS 控制台中的磁盘使用量没有太大变化。
尝试了 运行 查询,基于 table 大小也没有太大变化。
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;
这正常吗?或者磁盘 space 根本没有被回收?
VACUUM 回收死元组占用的存储空间,也就是说,它将 table 文件和索引中的 space 标记为可重用,但不会释放磁盘 space.
我想你想要的是一个重写整个 table 和索引的命令,同时只保留真正存在的数据。那将是 CLUSTER,或 VACUUM FULL,或需要 table 重写的 ALTER TABLE 的一种形式。如果您的性能可以从特定顺序的聚类中获益,那么现在就是这样做的好时机。
虽然它会锁定 table,所以不要在需要不间断访问的实时服务器上执行此操作,除非 table 很小并且您可以忍受几秒钟的停机时间。