我们在RDS实例中运行postgresql 9.5.2。我们注意到的一件事是,某个表的大小有时会非常迅速地增长。
该表仅具有33,000行和〜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集x = x * 2
但不能-查询前后的表大小保持不变。
问题是在一个表中有600列,这从来都不是一个好主意。这将导致很多问题,表大小只是其中之一。
从PostgreSQL文档...
[对于数值]的实际存储要求是每组四个十进制数字的两个字节,外加三到八个字节的开销。
所以decimal(25, 6)
是一样的东西8 +(4分之31* 2)或约每列24个字节。每行600列,即每行约14,400字节或每行14k。在33,000行中,大约为450兆。
如果您每分钟更新每行4次,那么每分钟将有1.8排死行。
您应该问一个有关重新设计该表和流程的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句