postgresql - 我该如何优化这个 : Many Postgres triggers calling the same function within a transaction

标签 postgresql triggers

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

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

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

有没有办法对此进行优化,使 updateCachedField 函数仅被调用 5 次而不是 50 次以上?

最佳答案

我认为您最好的选择是基于 xmin 值或其他信息使用可延迟的约束触发器和查询。事实上,您还可以复制“日志”数据以在其他地方拍摄快照。

如果没有明确的信息,您并不清楚您在看什么,但一种选择是基本上拥有三组表格:

  1. 实时表格。更新(增量或其他聚合有用信息)在更新或插入时写入日志表。

  2. 日志表。这些只是追加。

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

然后您可以获得实时 View ,显示当前聚合数据,仅从上一个快照聚合。

关于postgresql - 我该如何优化这个 : Many Postgres triggers calling the same function within a transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903809/

相关文章:

Mysql/MariaDB 触发器问题和调试

mysql - 使用 phpmyadmin 自动更新表中的字段

Java getTime() 从 `time with time zone` 获取时间不正确

python - psycopg2 + pgbouncer。带有 gevent 错误的异步模式

regex - 如何使用 regexp_matches 获取多个 mached 关键字

sql - 在 oracle 中的 View 上触发

database-design - 无需存储过程或触发器即可工作

postgresql - 使用psql以SSL方式连接PostgreSQL

sql - 使用跨 2 个表的内部连接更新 Postgres?

sql - 在 SQL 触发器中使用等号时遇到问题