![]() |
1
14
数据库确实不是收集大量小更新的最佳工具,但是由于我不知道您的查询能力和ACID要求,所以我不能真正推荐其他东西。如果这是一种可接受的方法,那么zzzeek建议的应用程序端更新聚合可以帮助显著降低更新负载。 有一种类似的方法,可以让您以某种性能成本来查询更新鲜的数据,并提供持久性和能力。创建一个缓冲区表,该表可以收集对需要更新的值所做的更改,并将更改插入其中。在事务中定期将表重命名为其他表,并创建一个新表来代替它。然后在事务中汇总所有更改,对主表进行相应的更新并截断缓冲区表。这样,如果您需要任何数据的一致和新的快照,您可以从主表中进行选择,并从活动和重命名的缓冲区表中加入所有更改。 但是,如果两者都不可接受,您还可以调整数据库以更好地处理大量的更新负载。 要优化更新,请确保PostgreSQL可以使用 heap-only tuples 存储行的更新版本。为此,请确保频繁更新的列上没有索引,并更改 fillfactor 低于默认值100%。您需要自己确定一个合适的填充因子,因为它在很大程度上取决于工作负载和运行它的机器的详细信息。填充因子必须足够低,以便在Autovacuum有机会清除旧的不可见版本之前,所有更新都适合同一数据库页。您可以调整自动真空设置以在数据库密度和真空开销之间进行权衡。另外,考虑到任何长事务(包括统计查询)都将保留在事务启动后已更改的元组上。见 pg_stat_user_表 查看要调整的内容,尤其是 NuToupHythuPUD 到 更新(U) 和 活生生的 到 N-Dealth-Toup . 大量更新还将产生大量的提前写日志(wal)负载。调整Wal行为( docs for the settings )有助于降低这一点。特别是,更高的检查点段数和更高的检查点超时可以通过允许在内存中进行更多更新来显著降低IO负载。查看pg_stat_bgwriter中检查点时间与检查点要求的关系,查看由于达到任一限制而发生的检查点数量。提高共享缓冲区,使工作集适合内存也会有所帮助。检查buffers_checkpoint与buffers_clean+buffers_backend,看看有多少是为了满足检查点的要求而写的,而不是刚刚耗尽内存。 |
![]() |
2
6
当统计更新发生在某种类型的内存队列中时,您希望将它们组合起来,或者如果您更雄心勃勃,可以将它们组合到消息总线上。然后,一个接收过程会定期汇总这些统计更新——可以是每5秒到每小时——这取决于您想要什么。计数
通过这种方式,您可以将活动“批处理”成更大的块来控制pg数据库的负载量,还可以将许多并发活动序列化为单个流(或多个流,具体取决于发布更新的线程/进程的数量)。根据“period”调整的权衡是,有多少新鲜度与多少更新负载。 |
|
Johnny T · 基于当前值的SQL合并表[重复] 3 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 4 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 4 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 4 月前 |
![]() |
Sax · 规范化Google表格(第一步) 4 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 4 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 4 月前 |