Ale*_*rev 8 postgresql optimization database-tuning
我有几个表,每个表有 100-300 列整数类型,它们保存高度易变的数据。数据集由一两个主键作为键,刷新时删除整个数据集,并在一个事务中插入新数据。数据集大小通常是几百行,但在极端情况下可以达到几千行。每秒刷新一次,不同键的数据集更新通常是脱节的,因此删除和重新创建表是不可行的。
我如何调整 Postgres 来处理这样的负载?如果这有什么不同,我可以使用最新和最好的版本。
根据有多少不同的数据集,一种选择是对每个数据集的表进行分区。
当数据集更新时,BEGIN
新事务、TRUNCATE
表、COPY
新数据进入其中,以及COMMIT
. PostgreSQL 有一个优化,如果你正在使用(默认),在同一个事务中dCOPY
的表中执行更少的 I/O 。TRUNCATE
wal_level = minimal
如果您无法分区和截断(例如,如果您正在处理数以万计或数十万个数据集,其中表太多),您将希望启动 autovacuum 以尽可能多地运行,请确保您在删除的任何内容上都有良好的索引,并为一些普通的性能做好准备。
如果你不需要崩溃安全——你不介意系统崩溃后你的表是空的——你也可以将你的表创建为UNLOGGED
,这将为你节省大量的 I/O 成本。
如果您不介意在系统崩溃后从备份中恢复整个设置,您可以更进一步并设置fsync=off
,这基本上是对 PostgreSQL 说“不要担心崩溃安全,我有很好的备份,我不不在乎我的数据在崩溃后是否永久且完全无法恢复,而且我很高兴initdb
在我可以再次使用我的数据库之前重新恢复”。
我在 Stack Overflow 上关于优化 PostgreSQL 以进行快速测试的类似主题中写了更多相关内容;提到主机操作系统调整,如果您不使用unlogged
表,检查指针调整等,将 WAL 分离到不同的磁盘上。
归档时间: |
|
查看次数: |
1613 次 |
最近记录: |