VACUUM通常不会将磁盘空间返回给操作系统,除非在某些特殊情况下。
从文档:
VACUUM删除表和索引中的死行版本并标记可用空间以供将来重用的标准形式。但是,它不会将空间返回给操作系统,除非在表末尾的一个或多个页面完全空闲并且可以轻松获得排他表锁的特殊情况下。相比之下,VACUUM FULL通过编写一个没有死空间的完整新版本的表文件来主动压缩表。这最大限度地减少了表的大小,但可能需要很长时间。它还需要额外的磁盘空间用于表的新副本,直到操作完成。
问题是:如何实现这个数据库状态one or more pages at the end of a table become entirely free?这可以通过 完成VACUUM FULL,但我没有足够的空间来实现它。那么还有没有其他可能呢?
我知道空间不会突然释放(除非有TRUNCATE)。但是这个在我看来很不正常。
postgresql (9.3.10) 表在删除了 70% 的记录后没有释放空间的原因是什么?
我有一张桌子叫user_sessions_session. 顾名思义,它为 Web 应用程序的每个用户存储会话数据。
它的原始尺寸是:
Table | Size | External Size
----------------------------------+---------+---------------
user_sessions_session | 15 GB | 13 GB
Run Code Online (Sandbox Code Playgroud)
此后,我删除了 3 个月前的所有用户会话。这是表中的大部分行。这是 3 天前。我刚刚再次检查了表的大小,这是我看到的:
Table | Size | External Size
----------------------------------+---------+---------------
user_sessions_session | 15 GB | 13 GB
Run Code Online (Sandbox Code Playgroud)
此外,select * from pg_stat_activity where query like 'autovacuum:%';显示此时没有进行吸尘。
顺便说一句,我以前在同一个会话表上遇到过同样的问题 - 这不是一次性的。
以防万一,这是我用来获取表大小的 SQL(user_sessions_session 在列表中显示为第 1):
SELECT
relname as "Table",
pg_size_pretty(pg_total_relation_size(relid)) As "Size",
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as "External Size"
FROM pg_catalog.pg_statio_user_tables …Run Code Online (Sandbox Code Playgroud)