我的一个数据库表中有一个缓存的字段,它根据许多不同的表和这些表中字段的状态进行更新。
这些表中的每一个都通过触发器调用相同的函数:updateCachedField(basetable_id INTEGER)。updateCachedField函数查询所有其他表,并计算基表的新缓存值。updateCachedField函数很复杂,而且成本很高。
在单个事务期间,可能会更改影响缓存字段的许多表。因此,在单个事务期间,updateCachedField函数可能会被调用50次。。。但是只有5个不同的basetable_id。
有没有一种方法可以优化这一点,使updateCachedField函数只被调用5次,而不是50多次?
我认为最好的选择是使用可延迟的约束触发器,并根据xmin值或其他信息进行查询。实际上,您还可以将用于快照的"日志"数据复制到其他地方。
如果没有明确的信息,你所看到的并不清楚,但有一种选择是基本上有三组表:
-
活动表。更新(delta或其他聚合有用信息)会在更新或插入时写入日志表。
-
日志表。这些只是附加的。
-
聚合快照表,定期聚合新的日志表集。
然后,您可以有一个实时视图,显示当前聚合数据,仅从上一个快照进行聚合。