我目前正在为一大堆表创建物化视图日志,以支持使用 FAST REFRESH 的物化视图。我们正在创建的物化视图包含来自不同表的大约 30 列。我们的一个事实表包含大约 15 个列,这些列将在物化视图中使用。
创建 MV Log 时是否需要枚举 MV 中需要的基表中的所有列?
CREATE MATERIALIZED VIEW LOG ON SCHEMA.TABLE_A
WITH ROWID, PRIMARY KEY, SEQUENCE (COL1, COL2, COL3, ..., COL48)
INCLUDING NEW VALUES;
以上是我当前如何创建 MV 日志的示例。我承认以上是反复试验的结果,没有彻底了解语句中每个组件的工作原理(我最了解)。
在什么情况下我需要定义哪些列应该包含在 MV 日志中?
一些物化视图将只是跨多个表的连接。其他将包括聚合、分组、总和等。
不,您不需要在创建物化视图日志时枚举物化视图中使用的列。实际上,您不能使用主键方法创建物化视图日志并包括所有列,因为您将包括主键列本身,这是不允许的。
物化视图日志的概念是存储发生变化的数据的rowid或主键。然后刷新可以从表中查找整个记录。将特定列添加到日志的 WITH 子句中,将数据显式记录在物化视图日志本身中。如果您的物化视图查询正在过滤这些列或加入它们,则可以加快刷新速度。
理论上,如果MV中使用的所有列都在日志中,那么它应该能够在不引用表的情况下进行刷新。该文档并未表明正在执行此操作。追踪这一点会很有趣。即使是这样,额外的存储要求也可能不会让这条路线值得麻烦。
您可能应该只创建物化视图日志而不指定列列表,如下所示:
更多信息: