我在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;
回滚此事务后,工资表的大小正在增加,但没有创建记录。
答案 0 :(得分:1)
文件变大,因为在回滚事务之前将记录写入表的文件。即使它们在文件中,它们也不会被其他交易看到。
查询性能受文件中死元组的影响,因为简单地说,查询可能必须在查找活动记录时读取它们。这就是为什么PostgreSQL有一个名为" vacuuming"清理未使用的数据,释放它占用的空间用于新记录。
最近的PostgreSQL版本中途将在必要时自动清空表格。您也可以使用VACUUM SQL命令强制执行此操作:
VACUUM salary;
或者在命令行上:
vacuumdb -t salary database
除非你在桌面上有一些非常大规模的活动,否则你不需要这样做。请注意,即使在吸尘之后,文件通常也不会变小:VACUUM不会移动记录,因此文件大小由最后一条活动记录的位置控制。