Answers:
由于PostgreSQL处理事务和并发的方式,MVCC-多版本并发控制,您可能会肿。在PostgreSQL中,当您执行UPDATE
或时DELETE
,实际上并没有实际删除该行。对于DELETE
,它只是标志着行作为不可用于将来的交易,以及UPDATE
,引擎盖这是一个组合下INSERT
,然后DELETE
,在该行的前一个版本标记为不可用。
数据标记为不可用时,它仍然存在,并且无法使用空间。为了将空间标记为可供数据库使用,需要在操作后进行真空处理,并标记该空间可供数据库使用。但是,它不会返回到操作系统。仅当整个页面中没有活动的行时才会发生这种情况,这在某些工作负载中很少见。对于某些工作负载而言,这可能是一件好事,因为您可以简单地更新数据文件内部各个页面上的空间,而无需添加其他数据文件。
当死元组与活元组的数量过多时,膨胀会带来问题。遍历并检查所有可见性标志需要花费时间,并且具有更多数据关系的文件会导致额外的不必要的IO负载。膨胀在索引上尤其明显,索引也可能有很多死元组,有时比表还多。Bloat会减慢索引查找和扫描的速度,这将在缓慢增加的查询时间和更改查询计划中显示。
您可以使用恢复空间pg_reorg,pg_repack,CLUSTER
或VACUUM FULL
。这将经历并重新组织文件,移动元组并进行重新组织以确保没有无效的元组,从而消除了膨胀。
还可以通过调整VACUUM
每个表的设置来有效地管理Bloat ,这标志着死元组空间可用于后续查询重用。
您可以在PostgreSQL Wiki上使用与Show Database Bloat和Index Bloat相关的查询来确定您有多少膨胀,然后从中进行一些性能分析,以查看表上的膨胀量是否存在问题。