为瞬态数据优化 PostgreSQL

Ale*_*rev 8 postgresql optimization database-tuning

我有几个表,每个表有 100-300 列整数类型,它们保存高度易变的数据。数据集由一两个主键作为键,刷新时删除整个数据集,并在一个事务中插入新数据。数据集大小通常是几百行,但在极端情况下可以达到几千行。每秒刷新一次,不同键的数据集更新通常是脱节的,因此删除和重新创建表是不可行的。

我如何调整 Postgres 来处理这样的负载?如果这有什么不同,我可以使用最新和最好的版本。

Cra*_*ger 7

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

当数据集更新时,BEGIN新事务、TRUNCATE表、COPY新数据进入其中,以及COMMIT. PostgreSQL 有一个优化,如果你正在使用(默认),在同一个事务中dCOPY的表中执行更少的 I/O 。TRUNCATEwal_level = minimal

如果您无法分区和截断(例如,如果您正在处理数以万计或数十万个数据集,其中表太多),您将希望启动 autovacuum 以尽可能多地运行,请确保您在删除的任何内容上都有良好的索引,并为一些普通的性能做好准备。

如果你不需要崩溃安全——你不介意系统崩溃后你的表是空的——你也可以将你的表创建为UNLOGGED,这将为你节省大量的 I/O 成本。

如果您不介意在系统崩溃后从备份中恢复整个设置,您可以更进一步并设置fsync=off,这基本上是对 PostgreSQL 说“不要担心崩溃安全,我有很好的备份,我不不在乎我的数据在崩溃后是否永久且完全无法恢复,而且我很高兴initdb在我可以再次使用我的数据库之前重新恢复”。

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

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