我们正在使用Postgres存储~ 2.000.000.000个样品。这最终出现在具有大约500兆条目和~100 in大小的表中。
我想要做的事情:例如更新表条目:UPDATE table SET flag = true;
在此之后,该表的大小是原来的两倍,即200 on,以获得空间(存储在SSD上)--我们:“全表”
不幸的是,这一步再次需要大量的空间,由于空间太少,导致真空失效。
我的问题是:是否意味着,为了只进行一次更新查询,并为这个DB中的其他表获取空间,我们至少需要300-400 DB的空间来处理100 DB的表?。
发布于 2017-03-09 09:10:45
在您的场景中,如果没有至少两倍于表数据所需的空间,就无法逃脱。
最便宜的解决方案可能是定义一个fillfactor为50的表,这样每个块中有一半是空的,从而使表的大小翻一番。然后,更新后的行都可以与原始行位于同一个块中,而且UPDATE不会增加表的大小,因为PostgreSQL只能使用堆元组(热)更新特性。如果没有长时间运行的事务仍然可以看到,则将立即释放旧版本。
注意:只有当您正在更新的colum没有索引时,才能工作。
这种方法的缺点是,表的大小总是必要的两倍,而所有的顺序扫描都需要两倍的时间。如果您不使用表的顺序扫描,它不会困扰您。
https://stackoverflow.com/questions/42682555
复制相似问题