如何优化:许多Postgres触发器在事务中调用相同的函数



我的一个数据库表中有一个缓存的字段,它根据许多不同的表和这些表中字段的状态进行更新。

这些表中的每一个都通过触发器调用相同的函数:updateCachedField(basetable_id INTEGER)。updateCachedField函数查询所有其他表,并计算基表的新缓存值。updateCachedField函数很复杂,而且成本很高。

在单个事务期间,可能会更改影响缓存字段的许多表。因此,在单个事务期间,updateCachedField函数可能会被调用50次。。。但是只有5个不同的basetable_id。

有没有一种方法可以优化这一点,使updateCachedField函数只被调用5次,而不是50多次?

我认为最好的选择是使用可延迟的约束触发器,并根据xmin值或其他信息进行查询。实际上,您还可以将用于快照的"日志"数据复制到其他地方。

如果没有明确的信息,你所看到的并不清楚,但有一种选择是基本上有三组表:

  1. 活动表。更新(delta或其他聚合有用信息)会在更新或插入时写入日志表。

  2. 日志表。这些只是附加的。

  3. 聚合快照表,定期聚合新的日志表集。

然后,您可以有一个实时视图,显示当前聚合数据,仅从上一个快照进行聚合。

最新更新