我有几张桌子,每张桌子都有100-300个整数类型的列,这些表保存高度易变的数据。数据集由一或两个主键进行键控,当刷新发生时,整个数据集将被删除,新数据将被插入到一个事务中。数据集的大小通常为几百行,但在极端情况下可以达到几千行。刷新每秒发生一次,并且通常不区分针对不同键的数据集更新,因此删除和重新创建表是不可行的。
如何调整Postgres以处理此类负载?如果有任何不同,我可以使用最新和最好的版本。
我有几张桌子,每张桌子都有100-300个整数类型的列,这些表保存高度易变的数据。数据集由一或两个主键进行键控,当刷新发生时,整个数据集将被删除,新数据将被插入到一个事务中。数据集的大小通常为几百行,但在极端情况下可以达到几千行。刷新每秒发生一次,并且通常不区分针对不同键的数据集更新,因此删除和重新创建表是不可行的。
如何调整Postgres以处理此类负载?如果有任何不同,我可以使用最新和最好的版本。
Answers:
根据有多少个不同的数据集,一种选择是对每个数据集划分表。
更新数据集时,将BEGIN
有一个新的事务,TRUNCATE
表,COPY
新数据,以及COMMIT
。PostgreSQL有其中一个优化COPY
荷兰国际集团进入这一直是一个表TRUNCATE
d 在同一事务中,如果你使用确实少得多的I / O wal_level = minimal
(默认)。
如果您无法进行分区和截断(例如,如果要处理成千上万的数据集,那么表太多),您将需要提高自动清理的运行速度,请确保在删除的任何内容上都有良好的索引,并准备好一些普通的性能。
如果您不需要崩溃安全-您不介意系统崩溃后表为空 -您还可以将表创建为UNLOGGED
,这将节省大量I / O成本。
如果您不介意在系统崩溃后不必从备份中还原整个设置,则可以进一步进行设置fsync=off
,它基本上对PostgreSQL说:“不用担心崩溃安全,我有很好的备份,我没有“不管崩溃后我的数据是否永久且完全不可恢复,我很乐意在重新initdb
使用数据库之前重新进行操作”。
我在Stack Overflow的类似主题中写了更多有关此问题的内容,内容涉及优化PostgreSQL以进行快速测试;提到主机操作系统调整,如果不使用unlogged
表,检查指针调整等,则将WAL分离到另一个磁盘上。
SIGKILL
ed等)关闭后,任何UNLOGGED
表都可能被TRUNCATE
删除,因此它们在启动时为空。干净关闭并重新启动后,它们不会被截断,但是您不应该依赖它们的持久性。
UNLOGGED
每桌的选择是好了。
TRUNCATE
或更有效DROP/CREATE TABLE
?
TRUNCATE
个人建议您。DDL流失有其自己的成本。由于您经常进行如此频繁的更改,因此确保您打开自动清理的积极性pg_catalog.pg_class
以及可能在该工作负载下膨胀的其他系统表非常重要。