什么是数据库中的表膨胀?


9

有人可以解释数据库术语中的膨胀吗?例如,说索引过大意味着什么。我尝试搜索它,但没有解释什么是腹胀,仅解释了它是由什么原因引起的。

Answers:


16

由于PostgreSQL处理事务和并发的方式,MVCC-多版本并发控制,您可能会肿。在PostgreSQL中,当您执行UPDATE或时DELETE,实际上并没有实际删除该行。对于DELETE,它只是标志着行作为不可用于将来的交易,以及UPDATE,引擎盖这是一个组合下INSERT,然后DELETE,在该行的前一个版本标记为不可用。

数据标记为不可用时,它仍然存在,并且无法使用空间。为了将空间标记为可供数据库使用,需要在操作后进行真空处理,并标记该空间可供数据库使用。但是,它不会返回到操作系统。仅当整个页面中没有活动的行时才会发生这种情况,这在某些工作负载中很少见。对于某些工作负载而言,这可能是一件好事,因为您可以简单地更新数据文件内部各个页面上的空间,而无需添加其他数据文件。

当死元组与活元组的数量过多时,膨胀会带来问题。遍历并检查所有可见性标志需要花费时间,并且具有更多数据关系的文件会导致额外的不必要的IO负载。膨胀在索引上尤其明显,索引也可能有很多死元组,有时比表还多。Bloat会减慢索引查找和扫描的速度,这将在缓慢增加的查询时间和更改查询计划中显示。

您可以使用恢复空间pg_reorgpg_repackCLUSTERVACUUM FULL。这将经历并重新组织文件,移动元组并进行重新组织以确保没有无效的元组,从而消除了膨胀。

还可以通过调整VACUUM每个表的设置来有效地管理Bloat ,这标志着死元组空间可用于后续查询重用。

您可以在PostgreSQL Wiki上使用与Show Database BloatIndex Bloat相关的查询来确定您有多少膨胀,然后从中进行一些性能分析,以查看表上的膨胀量是否存在问题。


-1

这可能是索引的常见问题,其中索引中添加了两个很多列,或者表上有重叠的索引。也就是说,其中有一组相同列的多个索引(使其中一个不必要)。我将查看表上的所有索引,以查找重叠的列,查找只是其他索引的子集的索引,如果可以确定未使用它们,则将其删除。

最重要的是,随着表中数据的更新,索引可能会变得碎片化,从而导致索引超出必要范围。我对postgres并不熟悉,但是我怀疑有一些方法可以对索引进行碎片整理(通过重建索引),以减少磁盘上的大小。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.