我有一个基于其他物化视图、常规视图以及一些表的非常复杂的 Oracle 视图(我不能“快速刷新”它)。大多数情况下,此视图中的现有记录基于日期并且是“稳定的”,新记录集具有新日期。
有时,我会收到回溯日期。如果我在维护一张桌子,我知道这些是什么以及如何处理它们,但我想保持这个“视图”。完全刷新大约需要 30 分钟,但对于任何给定日期,只需要 25 秒。
我可以指定只更新物化视图的一部分(即受影响的日期)吗?
我是否必须废弃视图并使用表格和过程来填充或刷新该表格中的给定日期?
我有一个基于其他物化视图、常规视图以及一些表的非常复杂的 Oracle 视图(我不能“快速刷新”它)。大多数情况下,此视图中的现有记录基于日期并且是“稳定的”,新记录集具有新日期。
有时,我会收到回溯日期。如果我在维护一张桌子,我知道这些是什么以及如何处理它们,但我想保持这个“视图”。完全刷新大约需要 30 分钟,但对于任何给定日期,只需要 25 秒。
我可以指定只更新物化视图的一部分(即受影响的日期)吗?
我是否必须废弃视图并使用表格和过程来填充或刷新该表格中的给定日期?
按日期分区,如答案 3 (skaffman)。
你可以只刷新一个普通的 mv(table_refreshed
下面) 而不是使用 exchange 关键字,即
ALTER TABLE all_partitions
EXCHANGE PARTITION to_calculate
WITH TABLE table_refreshed
WITHOUT VALIDATION
UPDATE GLOBAL INDEXES;
经过更多阅读和对这个问题缺乏答案的判断,我得出的结论是不可能刷新物化视图的单个分区。
如果你能给出一个证明不是这样的语法示例,我很乐意将你的答案标记为已接受的答案。
对于将来可能会发现此问题有用的其他人:您可能还想知道在 Oracle 10g 中,刷新分区(或任何 mview)将导致 OracleDELETE
发出INSERT
.
如果这给您带来了性能问题(像我一样),那么可以选择使用atomic_refresh => false
,TRUNCATE
然后INSERT /*+APPEND*/
.
我已经能够使用分区更改跟踪刷新物化视图的单个分区。
似乎需要使用REFRESH FAST WITH ROWID
选项创建视图并DBMS_MVIEW.REFRESH
使用方法调用'P'
。
您可以像使用普通表一样对物化视图进行分区。按日期对 mview 进行分区,然后您只能刷新所需的分区。