Roc*_*nja 1 postgresql materialized-view pgbouncer postgresql-9.4
我有一个物化视图,创建大约需要 57 秒,并且我使用的是 PostgreSQL 9.4。
当我插入表时,触发器将调用触发器函数,该函数将REFRESH MATERIALIZED VIEW CONCURRENTLY view触发触发器after each statement(插入、更新、删除)
发生的情况是,执行插入操作大约需要 57 秒。
如何解决此问题并仍然使用物化视图?
我已经实现了很长时间,从来没有出现过这个问题,最近我添加了pgbouncer,会不会是这个原因?
通常,仅当对基础表的写访问是罕见事件时,立即刷新 MV 似乎是合理的。语句级触发器比行级触发器更好,但对于大表来说可能仍然太多。我会考虑一个解决方案,每 n 分钟轮询一次数据库检查更新。您可以将触发器写入具有单行的表。
或者你可以使用LISTEN/NOTIFY。
只要您想立即传播每个更改(几乎),您可能最好在插入/更新/删除时使用行级触发器写入手工编织的“物化视图”(表),如@trygvis 建议。
由于 pgbouncer 保持会话处于打开状态,因此可能存在未提交事务的锁定问题,从而减慢进程的速度,但我只是在这里推测。您可以在没有 pgbouncer 的情况下在数据库副本中运行测试。或者通过查找来检查僵尸交易pg_stat_activity。