0

我们正在重构表和视图的结构,其中一项改进是将一个表(从 java 类“手动”更新)更改为连续视图。

视图的名称必须与旧表相同,并且必须保留旧数据,所以我认为这些步骤是合乎逻辑的:

  1. ALTER TABLE old_table 重命名为 old_table_temp
  2. 创建新的连续视图
  3. 插入到 new_continuous_view SELECT * FROM old_table_temp
  4. 删除 old_table_temp

我现在遇到的问题是,在重命名表时,所有依赖视图仍将依赖于新命名的表,因此我无法删除它。错误如下所示:

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

任何想法都会受到赞赏,即使它是一种不同的方法。

4

1 回答 1

1

这是不可能的。每个连续视图都由一个物化表(后缀为_mrel)支持,该表存储在连续视图中计算的所有聚合的转换状态。在读取时,这些转换状态被转换为最终的聚合值。一个简单的例子是avg具体化表存储总和和计数,在读取时我们通过将两者相除来计算平均值。

这些转换状态主要是字节数组,它们的内部实现不暴露给用户,因此创建它们的唯一方法是将数据回填到连续视图正在读取的流中,并让我们的连续查询执行管道重新计算它们.

默认情况下禁用对实现表的修改,但您可以通过设置配置参数来启用它们continuous_query_materialization_table_updatable。如果您要截断旧数据或删除要回填数据的特定组的数据,这可能很有用。

就迁移依赖视图而言,我认为最简单的方法是在连续视图上重新定义它们。整个依赖管理是 PostgreSQL 内部的,不建议手动调整。

于 2015-11-28T17:47:28.560 回答