postgresql中快速增长的表

时间:2017-01-13 02:27:23

标签: postgresql

我们在RDS实例中运行postgresql 9.5.2。我们注意到的一件事是某张桌子有时会变得非常快。

有问题的表只有33k行和~600列。所有列都是数字(十进制(25,6))。真空充满后,在以下查询中报告“total_bytes”

select c.relname, pg_total_relation_size(c.oid) AS total_bytes
from pg_class c;

约150MB。但是,我们观察到它一度增长到71GB。在最近的一集中,total_bytes在30分钟内增长了10GB。

在上面提到的那集中,我们有一个批量更新查询,每分钟运行约4次,更新表中的每条记录。但是,在其他时候,尽管类似的更新活动,表格大小仍保持不变。

我知道这可能是由于更新遗留下来的“死记录”造成的。事实上,当这张桌子变得太大时,只需将真空充满就会将其缩小到正常尺寸(150M)。我的问题是

  • 让其他人在postgresql中经历类似表大小的快速增长,这是正常的吗?

  • 如果我们的批量更新查询导致表格大小快速增长,为什么不每次都发生?事实上,我试图通过运行类似

    的方式手动重现它

    更新my_table set x = x * 2

但不能 - 表格大小在查询之前和之后保持不变。

1 个答案:

答案 0 :(得分:1)

问题是在一个表中有600列,这绝不是一个好主意。这会导致很多问题,表格大小只是其中之一。

来自PostgreSQL docs ...

  

[数值]的实际存储要求是每组四个十进制数字的两个字节,加上三到八个字节的开销。

所以decimal(25, 6)类似于8 +(31/4 * 2)或每列约24个字节。每行600列,每行约14,400字节或每行14k。在33,000行,大约450兆。

如果你每分钟更新每一行4次,那么每分钟就会留下大约1.8公斤的死行。

  1. 您应该修复架构设计。
  2. 您不需要每分钟触摸一次桌子的每一行。
  3. 您应该询问有关重新设计该表和流程的问题。