针对瞬时数据优化PostgreSQL


8

我有几张桌子,每张桌子都有100-300个整数类型的列,这些表保存高度易变的数据。数据集由一或两个主键进行键控,当刷新发生时,整个数据集将被删除,新数据将被插入到一个事务中。数据集的大小通常为几百行,但在极端情况下可以达到几千行。刷新每秒发生一次,并且通常不区分针对不同键的数据集更新,因此删除和重新创建表是不可行的。

如何调整Postgres以处理此类负载?如果有任何不同,我可以使用最新和最好的版本。

Answers:


7

根据有多少个不同的数据集,一种选择是对每个数据集划分表。

更新数据集时,将BEGIN有一个新的事务,TRUNCATE表,COPY新数据,以及COMMIT。PostgreSQL有其中一个优化COPY荷兰国际集团进入这一直是一个表TRUNCATEd 在同一事务中,如果你使用确实少得多的I / O wal_level = minimal(默认)。

如果您无法进行分区和截断(例如,如果要处理成千上万的数据集,那么表太多),您将需要提高自动清理的运行速度,请确保在删除的任何内容上都有良好的索引,并准备好一些普通的性能。

如果您不需要崩溃安全-您不介意系统崩溃后表为 -您还可以将表创建为UNLOGGED,这将节省大量I / O成本。

如果您不介意在系统崩溃后不必从备份中还原整个设置,则可以进一步进行设置fsync=off,它基本上对PostgreSQL说:“不用担心崩溃安全,我有很好的备份,我没有“不管崩溃后我的数据是否永久且完全不可恢复,我很乐意在重新initdb使用数据库之前重新进行操作”。

我在Stack Overflow的类似主题中写了更多有关此问题的内容,内容涉及优化PostgreSQL以进行快速测试;提到主机操作系统调整,如果不使用unlogged表,检查指针调整等,则将WAL分离到另一个磁盘上。

Pg文档中还有一些信息可用于快速加载数据非持久设置


感谢您提供的分区技巧,在这种情况下我从未考虑过使用它们。至于未记录的表-您是说它们默认在系统崩溃后最终为空吗?没关系,我很好奇。
Alex Tokarev

1
@AlexTokarev是的;PostgreSQL异常关闭后(postmaster或后端segfaults,系统突然关机,后端SIGKILLed等)关闭后,任何UNLOGGED表都可能被TRUNCATE删除,因此它们在启动时为空。干净关闭并重新启动后,它们不会被截断,但是您不应该依赖它们的持久性。
Craig Ringer

感谢您的解释。我不需要有关表的数据安全,它们中的数据是瞬态的,并且每秒从源中刷新一次。但是,关闭fsync并不是一种选择,因为同一模式中还有其他更传统的表确实需要安全和可恢复的。具有UNLOGGED每桌的选择是好了。
Alex Tokarev

我正在查看分区文档,它看起来可能是(几乎)完美的解决方案。但是,有一个问题:如果我要为架构表和子表提供一个父表来保存数据,那么我将从父表中查询数据,对吗?如果存在该范围的子表,查询将返回该表,否则将返回空数据集。在那种情况下,我什至可以为每个新数据批删除并重新创建子表。在这种情况下,哪种方法更有效TRUNCATE或更有效DROP/CREATE TABLE
Alex Tokarev

@AlexTokarev我TRUNCATE个人建议您。DDL流失有其自己的成本。由于您经常进行如此频繁的更改,因此确保您打开自动清理的积极性pg_catalog.pg_class以及可能在该工作负载下膨胀的其他系统表非常重要。
Craig Ringer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.