问题描述
主要问题:我有几个视图,具体取决于Postgresql / PostGIS表和通过查询其他视图创建的最终物化视图。我需要一个快速且可更新的最终结果(即MV),以便在QGIS项目中使用。
我的目的是通过用新(很多)值覆盖起始表来更新起始表,并希望具有更新视图和实例化视图。我使用QGIS DB Manager覆盖现有表,但是由于mv依赖它而出现错误。如果我删除mv,覆盖表,然后重新创建mv,一切正常,但我希望尽可能避免手动操作。
有没有更好的方法可以实现我的目标?
另一个问题:如果我在更新/插入/删除表中的值时设置触发器以刷新mv,即使用新表覆盖整个表,它也可以工作吗?
解决方法
刷新实例化视图将运行完整的定义查询,因此对于复杂的查询而言,这是一个长期运行且繁重的操作。
可以从触发器中启动REFRESH MATERIALIZED VIEW
(最好是FOR EACH STATEMENT
触发器),但这会使每次数据修改都很慢,以至于我认为这实际上是不可行的
可能有用的一件事是实现类似于“手动”立即刷新的物化视图之类的东西:
-
为“物化视图”创建一个常规表,并通过运行查询将其填充数据
-
在每个基础表上,定义一个行级触发器,该触发器根据触发它的更改来修改实例化视图
这对于定义足够简单的视图应该有效,对于复杂的查询则不可能。