覆盖现有的postgis表时,物化视图出现问题

问题描述

主要问题:我有几个视图,具体取决于PostgreSQL / PostGIS表和通过查询其他视图创建的最终物化视图。我需要一个快速且可更新的最终结果(即MV),以便在QGIS项目中使用。

我的目的是通过用新(很多)值覆盖起始表来更新起始表,并希望具有更新视图和实例化视图。我使用QGIS DB Manager覆盖现有表,但是由于mv依赖它而出现错误。如果我删除mv,覆盖表,然后重新创建mv,一切正常,但我希望尽可能避免手动操作。

有没有更好的方法可以实现我的目标?

另一个问题:如果我在更新/插入/删除表中的值时设置触发器以刷新mv,即使用新表覆盖整个表,它也可以工作吗?

解决方法

刷新实例化视图将运行完整的定义查询,因此对于复杂的查询而言,这是一个长期运行且繁重的操作。

可以从触发器中启动REFRESH MATERIALIZED VIEW(最好是FOR EACH STATEMENT触发器),但这会使每次数据修改都很慢,以至于我认为这实际上是不可行的

可能有用的一件事是实现类似于“手动”立即刷新的物化视图之类的东西:

  • 为“物化视图”创建一个常规表,并通过运行查询将其填充数据

  • 在每个基础表上,定义一个行级触发器,该触发器根据触发它的更改来修改实例化视图

这对于定义足够简单的视图应该有效,对于复杂的查询则不可能。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...