创建 MV 日志时是否需要枚举物化视图中使用的列?

Jos*_*ton 7 oracle data-warehouse view

我目前正在一大堆表上创建物化视图日志,以支持具有快速刷新的物化视图。我们正在创建的物化视图包含来自各种表的大约 30 列。我们的一个事实表包含大约 15 列,这些列将用于物化视图。

创建MV日志时,是否有必要枚举MV中所需的基表中的所有列?

CREATE MATERIALIZED VIEW LOG ON SCHEMA.TABLE_A 
  WITH ROWID, PRIMARY KEY, SEQUENCE (COL1, COL2, COL3, ..., COL48)
  INCLUDING NEW VALUES;
Run Code Online (Sandbox Code Playgroud)

以上是我目前如何创建 MV 日志的示例。我承认以上是反复试验的结果,没有彻底了解语句中每个组件的工作原理(我最了解)。

什么情况下我需要定义哪些列应该包含在MV日志中?

一些物化视图只是跨多个表的连接。其他将包括聚合、分组、总和等。

Lei*_*fel 8

,在创建物化视图日志时,您不需要枚举物化视图中使用的列。事实上,您不能使用主键方法创建物化视图日志并包含所有列,因为您将包含主键列本身,这是不允许的。

物化视图日志的概念是存储发生变化的数据的rowid或主键。然后刷新可以从表中查找整个记录。将特定列添加到日志的 WITH 子句中,显式地记录了物化视图日志本身中的数据。如果您的物化视图查询在这些列上进行过滤或加入它们,则可以加快刷新速度。

理论上,如果 MV 中使用的所有列都在日志中,那么它应该能够在不引用表的情况下进行刷新。该文档并未表明正在执行此操作。追踪这一点会很有趣。即使是这样,额外的存储要求也可能使这条路线不值得麻烦。

您可能应该只创建物化视图日志而不指定列列表,如下所示:

CREATE MATERIALIZED VIEW LOG ON SCHEMA.TABLE_A 
   WITH ROWID, PRIMARY KEY, SEQUENCE INCLUDING NEW VALUES;
Run Code Online (Sandbox Code Playgroud)

更多信息: