表 tenk1:来源
create table tenk_copy (like tenk1 INCLUDING ALL);
insert into tenk_copy select * from tenk1;
alter table tenk_copy set (autovacuum_enabled = false);
ALTER TABLE tenk_copy SET (autovacuum_vacuum_scale_factor = 0.9);
select relname, relowner::regrole, reloptions from pg_class pc where pc.relname = 'tenk_copy';
返回
relname | relowner | reloptions
-----------+----------+---------------------------------------------------------------
tenk_copy | test | {autovacuum_enabled=false,autovacuum_vacuum_scale_factor=0.9}
(1 row)
--1
begin;
update tenk_copy set unique1 = unique1 + 1;
update tenk_copy set unique1 = unique1 - 1;
update tenk_copy set unique1 = unique1 + 1;
update tenk_copy set unique1 = unique1 - 1;
update tenk_copy set unique1 = unique1 + 1;
update tenk_copy set unique1 = unique1 - 1;
update tenk_copy set unique1 = unique1 + 1;
update tenk_copy set unique1 = unique1 - 1;
update tenk_copy set unique1 = unique1 + 1;
update tenk_copy set unique1 = unique1 - 1;
commit;
select * from pgstattuple('tenk_copy') \gx
返回
-[ RECORD 1 ]------+---------
table_len | 31080448
tuple_count | 10000
tuple_len | 2680000
tuple_percent | 8.62
dead_tuple_count | 100000
dead_tuple_len | 26800000
dead_tuple_percent | 86.23
free_space | 614216
free_percent | 1.98
再次运行--1
查询。然后查询 pgstattuple。
select * from pgstattuple('tenk_copy') \gx
-[ RECORD 1 ]------+---------
table_len | 59326464
tuple_count | 10000
tuple_len | 2680000
tuple_percent | 4.52
dead_tuple_count | 100000
dead_tuple_len | 26800000
dead_tuple_percent | 45.17
free_space | 28363688
free_percent | 47.81
20 次更新dead_tuple_count
只有 100000。我想这意味着创建了更多未使用的空间,我如何配置才能使它实际上有更多的死元组。
一旦没有人再关心这个元组,它的空间就可以被释放。指向元组的行指针不能被释放,它只是变成了墓碑(以便指向它的索引知道忽略它)。将元组转换为墓碑不需要真空,只需要删除墓碑本身。显然 pgstattuple 不将墓碑算作 dead_tuple_count 的一部分。
在同一个事务中进行更多更新,或者打开一个新会话并开始一个保存其快照的事务,然后保持打开状态。但你为什么要这样做?
VACUUM
在桌子上运行。如果确实如此autovacuum_enabled=false
(仔细检查!),它只能是以下之一:有人
VACUUM
手动跑到桌子上autovacuum_freeze_max_age
被设置为如此低得离谱的值,以至于触发了反环绕 autovacuum(即使在禁用 autovacuum 时也会运行)。如果 . 这应该留下一个日志条目log_autovacuum_min_duration = 0
。