我的一个数据库表中有一个缓存字段,该字段会根据许多不同的表和这些表中的字段状态进行更新。
这些表中的每一个都通过触发器调用相同的函数:updateCachedField(basetable_id INTEGER)。 updateCachedField 函数查询所有这些其他表并计算基表的新缓存值。 updateCachedField函数比较复杂,开销很大。
在单个事务中,可能会更改影响缓存字段的许多表。因此,在单个事务中,updateCachedField 函数可能会被调用 50 次……但只有 5 个不同的 basetable_id。
有没有办法对此进行优化,使 updateCachedField 函数仅被调用 5 次而不是 50 次以上?
最佳答案
我认为您最好的选择是基于 xmin 值或其他信息使用可延迟的约束触发器和查询。事实上,您还可以复制“日志”数据以在其他地方拍摄快照。
如果没有明确的信息,您并不清楚您在看什么,但一种选择是基本上拥有三组表格:
实时表格。更新(增量或其他聚合有用信息)在更新或插入时写入日志表。
日志表。这些只是追加。
聚合快照表,这些快照表定期聚合新的日志表集。
然后您可以获得实时 View ,显示当前聚合数据,仅从上一个快照聚合。
关于postgresql - 我该如何优化这个 : Many Postgres triggers calling the same function within a transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903809/