将 table 更改为连续视图 - 相关连续视图的问题
Changing a table into a continuous view - issue with dependent continuous views
我们正在重构 table 和视图的结构,其中一项改进是更改 table(从 java 更新 "manually" class) 到连续视图。
视图的名称必须与旧 table 相同,并且必须保留旧数据,所以我认为这些步骤是合乎逻辑的:
- 更改 TABLE old_table 重命名为 old_table_temp
- 创建新的连续视图
- 插入 new_continuous_view SELECT * 来自 old_table_temp
- 下降 old_table_temp
我现在遇到的问题是,重命名 table 时,所有依赖视图仍将依赖于新命名的 table,所以我无法删除它。错误如下所示:
analytics=> drop table renamed_table;
ERROR: cannot drop table renamed_table because other objects depend on it
DETAIL: continuous view cview1 depends on table renamed_table
continuous view cview2 depends on table renamed_table
continuous view cview3 depends on table renamed_table
continuous view cview4 depends on table renamed_table
任何想法都会受到赞赏,即使它是一种不同的方法。
这是不可能的。每个连续视图都由物化 table(后缀为 _mrel
)支持,它存储在连续视图中计算的所有聚合的过渡状态。在读取时,这些过渡状态被转换为最终的聚合值。一个简单的示例是 avg
,其中物化 table 存储总和和计数,并且在读取时我们通过将两者相除来计算平均值。
这些转换状态主要是字节数组,其内部实现不会向用户公开,因此创建它们的唯一方法是将数据回填到连续视图正在读取的流中,并让我们的连续查询执行管道重新计算它们。
默认情况下禁用对具体化 table 的修改,但您可以通过设置配置参数 continuous_query_materialization_table_updatable
来启用它们。这在您想要截断旧数据或删除要为其回填数据的特定组的数据的情况下可能很有用。
就迁移依赖视图而言,我认为最简单的方法是在连续视图上重新定义它们。整个依赖管理是 PostgreSQL 内部的,不推荐手动调整它。
我们正在重构 table 和视图的结构,其中一项改进是更改 table(从 java 更新 "manually" class) 到连续视图。
视图的名称必须与旧 table 相同,并且必须保留旧数据,所以我认为这些步骤是合乎逻辑的:
- 更改 TABLE old_table 重命名为 old_table_temp
- 创建新的连续视图
- 插入 new_continuous_view SELECT * 来自 old_table_temp
- 下降 old_table_temp
我现在遇到的问题是,重命名 table 时,所有依赖视图仍将依赖于新命名的 table,所以我无法删除它。错误如下所示:
analytics=> drop table renamed_table;
ERROR: cannot drop table renamed_table because other objects depend on it
DETAIL: continuous view cview1 depends on table renamed_table
continuous view cview2 depends on table renamed_table
continuous view cview3 depends on table renamed_table
continuous view cview4 depends on table renamed_table
任何想法都会受到赞赏,即使它是一种不同的方法。
这是不可能的。每个连续视图都由物化 table(后缀为 _mrel
)支持,它存储在连续视图中计算的所有聚合的过渡状态。在读取时,这些过渡状态被转换为最终的聚合值。一个简单的示例是 avg
,其中物化 table 存储总和和计数,并且在读取时我们通过将两者相除来计算平均值。
这些转换状态主要是字节数组,其内部实现不会向用户公开,因此创建它们的唯一方法是将数据回填到连续视图正在读取的流中,并让我们的连续查询执行管道重新计算它们。
默认情况下禁用对具体化 table 的修改,但您可以通过设置配置参数 continuous_query_materialization_table_updatable
来启用它们。这在您想要截断旧数据或删除要为其回填数据的特定组的数据的情况下可能很有用。
就迁移依赖视图而言,我认为最简单的方法是在连续视图上重新定义它们。整个依赖管理是 PostgreSQL 内部的,不推荐手动调整它。