我们在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
但不能 - 表格大小在查询之前和之后保持不变。
答案 0 :(得分:1)
问题是在一个表中有600列,这绝不是一个好主意。这会导致很多问题,表格大小只是其中之一。
来自PostgreSQL docs ...
[数值]的实际存储要求是每组四个十进制数字的两个字节,加上三到八个字节的开销。
所以decimal(25, 6)
类似于8 +(31/4 * 2)或每列约24个字节。每行600列,每行约14,400字节或每行14k。在33,000行,大约450兆。
如果你每分钟更新每一行4次,那么每分钟就会留下大约1.8公斤的死行。
您应该询问有关重新设计该表和流程的问题。