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

use*_*643 12 postgresql terminology

有人可以解释一下数据库术语中的膨胀是什么意思吗?例如,说索引膨胀是什么意思。我试图寻找它,但没有解释什么是腹胀,只有它引起了什么或它是由什么引起的。

Kas*_*dry 20

由于 PostgreSQL 处理事务和并发的方式,MVCC - 多版本并发控制,您可能会变得臃肿。在 PostgreSQL 中,当您执行UPDATEor 时DELETE,该行实际上并未被物理删除。对于 a DELETE,它只是将行标记为对未来事务不可用,而对于UPDATE,在幕后,它是一个组合INSERTthen DELETE,其中该行的先前版本被标记为不可用。

虽然数据被标记为不可用,但它仍然存在,无法使用空间。然后,为了将空间标记为可供数据库使用,需要在操作之后执行一个真空过程,并标记该空间可供数据库使用。但是,它不会返回到操作系统。只有当整个页面中没有活动行时才会发生这种情况,这在某些工作负载中并不常见。这对于某些工作负载来说可能是一件好事,因为您只需更新数据文件内各个页面上的空间,而无需添加额外的数据文件。

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

您可以使用恢复空间pg_reorgpg_repackCLUSTERVACUUM FULL。这将遍历并重新组织文件,移动元组并重新组织以确保没有死元组,这将消除膨胀。

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

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


pau*_*bin -2

这可能是指索引的常见问题,其中将两个多列添加到索引或表上存在重叠索引。也就是说,多个索引具有相同的列集(使得其中一个索引变得不必要)。我会检查表上的所有索引,查找重叠列,查找只是其他索引子集的索引,如果您可以确定它们没有被使用,则将其删除。

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