PostgreSQL表膨胀终结者

(译自:http://blog.dataegret.com/2018/03/postgresql-bloatbusters.html) 无论是DBA还是开发者,只要工作中使用PostgreSQL,多多少少都会遇到vacuum:DBA需要配置vacuum,开发者遇到因vacuum导致的数据库性能下降、慢查询问题。 背景vacuum对开发者来说是个黑盒,DBA知道vacuum很重要,vacuum的配置也很重要。不怎么熟悉vacuum的人只知道vacuum是清理数据库的垃圾收集器。有人会问,vacuum是怎么清理数据库的。可在官方文档中找到十分详细的答案,在这里只做个简短的概要。 处理数据时,PostgreSQL会为每一个客户端提供单独的快照。客户端对快照中的数据进行更新和删除,一些数据最终变成过期数据,但它们仍存在于数据库中,还占用表数据文件和索引数据文件的空间。因此数据文件中会存在碎片,引起整体数据库性能下降。这时候vacuum出来干活了,vacuum的主要任务就是清理表和索引中不需要的数据(死数据),为新加入的数据清理出来空间。 世界并不完美,vacuum也有存在的问题。比如,vacuum完成清理工作后,那些空间并没有真正被释放掉,只能被vacuum清理过的表和索引所利用。虽然看上去表和索引大小都已经减少了,但是实际上和vacuum清理前的大小是一样。这让很多刚开始使用Postgres的用户感到困惑。 还有,某些场景下vacuum比较无能为力,无法有效完成工作。比如执行空事务,vacuum会推迟清理死数据导致表和索引膨胀。空事务,…