真空充满后,为什么桌子尺寸不会改变?

时间:2017-01-24 08:42:50

标签: postgresql

这是代码。让我们创建包含10000行数据的表。

数据库版本是x86_64-suse-linux-gnu上的PostgreSQL 9.5.3

drop table if exists test;

create table test as 
select gs as id, md5(gs::text) as value from generate_series(1,10000) gs;

create unique index test_id_pkey on test using btree(id);
alter table test add primary key using index test_id_pkey;
analyze test;

select pg, pg_size_pretty(pg) pz from pg_relation_size('test') pg;

Results of last query: 672kb
Now

delete from test where id > 1000;
表的大小减少了10倍。现在让它真空吧。根据文档真空完全制作磁盘上的表副本并只写入活动行,这些只是原始的10%。

vacuum full test;
select pg, pg_size_pretty(pg) pz from pg_relation_size('test') pg;

Still size of table is 672kb

让我们尝试用 alter table 语句来做同样的事情。在磁盘上创建一个新的表副本,并只写入活动行

alter table jenkins.test alter column id type int;
select pg, pg_size_pretty(pg) pz from pg_relation_size('test') pg;

Still size of table is 672kb;

现在让我们创建一个大小为672kb的当前表的新表副本

drop table if exists test1;
create table test1 as 
select * from test;

create unique index test1_id_pkey on test1 using btree(id);
alter table test1 add primary key using index test1_id_pkey;
analyze test1;
select pg, pg_size_pretty(pg) pz from pg_relation_size('test1') pg

令人惊讶的是,这张桌子的大小只有72kb。吸尘投掷警告信息

INFO:  "test": found 0 removable, 10000 nonremovable row versions in 84 pages
DETAIL:  9000 dead row versions cannot be removed yet.

这只是一个例子。我试着添加更多行到1_000_000仍然相同。 表格行可以删除吗? 如何应对这种情况或做好准备?

1 个答案:

答案 0 :(得分:2)

您的问题来自VACUUM (VERBOSE)

INFO:  "test": found 0 removable, 10000 nonremovable row versions in 84 pages
DETAIL:  9000 dead row versions cannot be removed yet.

这可能意味着有一个长期运行的并发事务,可能仍需要发布DELETE之前的旧行版本。

终止所有正在运行的日志事务,它将正常工作。