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