如果要重用同一张表主要需要驱动器空间,只需删除列并删除vacuum
张表(不包括full
),或者将其留到自动吸尘器中,仅此而已.
既然我的数据库没有那种可用的空间,想确保自动吸尘器也有同样的要求吗
除非您采取额外的步骤来禁用自动吸尘器,否则它一直在您的服务器上运行:pg_stat_all_tables
系统视图可以告诉您最近发生的时间.查看服务器日志(log)以判断它报告的故障.你可以在pg_stat_progress_vacuum
中看到它的进展.
正如您引用的文档中所概述的,Regular vacuum
只为同一个表回收空间(除非它在最后释放整个页面),因此您通常不会看到与使用vacuum full
时一样多的总空间消耗下降.它执行就地的内部表清理,目的是保持其大小,而不试图压缩它.
如果您对表大小的估计值是pg_total_relation_size()
,那么不仅在表页中/从表页中,而且在表页的TOAST和索引中都有可以回收的空间.
索引是相关的,但又是独立的对象,因此它们占用的空间将被释放.如果您对这一列有索引,您将能够回收它使用的整个空间.将该列与其他一些列一起使用的索引将不得不删除并重新定义,这也意味着由于重写时的压缩以及整体较轻的 struct ,这也意味着一些额外的可用空间-只要您有空间来执行它.如果不这样做,则可以在删除索引定义之前将其保存:
create temp table index_definitions as select indexdef
from pg_indexes where schemaname='your_schema' and tablename='your_table';
一旦你有了空间,重新构建它们(在编辑掉你要删除的列之后)
do $p$ declare indexdef_ text;
begin for indexdef_ in select indexdef from index_definitions loop
execute indexdef_;
end loop;
drop table index_definitions;
end $p$;
默认情况下,所有vacuum
都与PROCESS_TOAST=true
一起运行,因此您的 cogo toast 也可以缩小.当你在体重下降后考虑vacuum full
,你可以考虑通过设置PROCESS_TOAST=false
来完全清理主桌,或者通过从系统pg_class
中挑选 cogo toast 来完全清理主桌:
select reltoastrelid::regclass, pg_size_pretty(pg_relation_size(reltoastrelid))
from pg_class
where reltoastrelid<>0 and 'r'=relkind
and (oid::regclass)::text='your_schema.your_table';
如果/当你做vacuum full
的时候,你可以跟踪它在pg_stat_progress_cluster
的进度.你也可以用verbose
来运行它.
在应用这些更改(删除列)之前,我是否需要升级空间?
你不需要.alter table...drop column
本身不会导致重写,所以它不需要空间.随后的自动吸尘器不会try 重写,因此也不需要它.
有办法在本地验证吗?
您可以设置该系统的镜像,通过pg_dump
|
psql
复制该表,使用虚拟记录填充其他表,以便您也有完全相同的剩余空间量,并在那里运行测试.将表格重写到另一个系统将使其紧凑,因此这并不完全是苹果对苹果的比较,但这是一个安全的测试场地.