我遇到了一篇非常有趣的文章:https://eng.uber.com/mysql-migration/,我不知道postgres有不可变的元组,并在每次更新后添加新的元组。这个决定的原因是什么? PS。一段时间后,旧的,没有活动的元组被删除了吗?
答案 0 :(得分:2)
如果你想了解这一点,你应该阅读优秀的PostgreSQL文档。
这背后的设计理念是PostgreSQL希望提供多版本化(保持旧版本的元组以避免在更新过程中阻止读取器)以提高并发性,同时不会给编写者带来相关负担(清理)旧版本,在回滚的情况下撤消工作。)
为方便起见, autovacuum 守护程序会定期扫描活动表,以释放任何人不再需要的元组使用的空间。
虽然这种做法当然也有其缺点(最明显的是,如果autovacuum无法跟上,表臃肿的危险),它避免了维持"回滚"或"撤消"像Oracle或InnoDB这样的数据库具有的数据结构(大量工作回滚长事务,不可预测"快照太旧"错误)。