为什么在每次事务回滚后,PostgreSQL中的表大小都在增加?

时间:2017-02-11 15:39:09

标签: sql postgresql transactions rollback

我在postgresql 9.6上运行一些测试。我创建了一个表:

CREATE TABLE salary
(
  id serial NOT NULL,
  employee_id numeric,
  salary_amount numeric,
  CONSTRAINT salary_pkey PRIMARY KEY (id)
)

然后插入一些数据并回滚:

begin;
insert into salary (employee_id, salary_amount)
values 
(2,1000),(3,2000),(5,2000),(6,2000),(7,2000),(9,2000),(4,2000);

rollback;

回滚此事务后,工资表的大小正在增加,但没有创建记录。

  1. 为什么在每次事务回滚后,空表的大小都在增加?
  2. 这会影响查询效果吗?

1 个答案:

答案 0 :(得分:1)

文件变大,因为在回滚事务之前将记录写入表的文件。即使它们在文件中,它们也不会被其他交易看到。

查询性能受文件中死元组的影响,因为简单地说,查询可能必须在查找活动记录时读取它们。这就是为什么PostgreSQL有一个名为" vacuuming"清理未使用的数据,释放它占用的空间用于新记录。

最近的PostgreSQL版本中途将在必要时自动清空表格。您也可以使用VACUUM SQL命令强制执行此操作:

 VACUUM salary;

或者在命令行上:

 vacuumdb -t salary database

除非你在桌面上有一些非常大规模的活动,否则你不需要这样做。请注意,即使在吸尘之后,文件通常也不会变小:VACUUM不会移动记录,因此文件大小由最后一条活动记录的位置控制。