问题 是否可以在Oracle中部分刷新物化视图?


我有一个非常复杂的Oracle视图,基于其他物化视图,常规视图以及一些表(我无法“快速刷新”它)。大多数情况下,此视图中的现有记录基于日期并且是“稳定的”,新记录集具有新日期。

偶尔,我会收到回复日期。如果我要保持一张桌子,我知道那些是什么以及如何处理它们,但我想保持这个“观点”。完全刷新大约需要30分钟,但任何给定日期只需25秒。

我是否可以指定只应更新物化视图的一部分(即受影响的日期)?

我是否必须废弃视图并使用表和过程来填充或刷新该表中的给定日期?


8184
2017-11-23 14:07


起源



答案:


按日期分区 如答案3(斯卡弗曼)。

你可以刷新一般的mv(table_refreshed 下面)并使用交换关键字即

ALTER TABLE all_partitions
  EXCHANGE PARTITION to_calculate
  WITH TABLE table_refreshed
  WITHOUT VALIDATION
  UPDATE GLOBAL INDEXES;

9
2017-10-22 08:29





经过更多的阅读和判断,由于缺乏对这个问题的答案,我得出的结论是,不可能刷新物化视图的单个分区。

如果您能给出一个证明其他方式的语法示例,我很乐意将您的答案标记为已接受的答案。

对于可能在将来发现这些问题有用的其他人:您可能还想知道在Oracle 10g中刷新分区(或任何mview)将导致Oracle发布 DELETE, 其次是 INSERT

如果这给您带来性能问题(比如我),可以选择使用 atomic_refresh => false,哪会 TRUNCATE, 然后 INSERT /*+APPEND*/


3
2018-01-20 19:07



为什么选择downvote? - Galghamon


答案:


按日期分区 如答案3(斯卡弗曼)。

你可以刷新一般的mv(table_refreshed 下面)并使用交换关键字即

ALTER TABLE all_partitions
  EXCHANGE PARTITION to_calculate
  WITH TABLE table_refreshed
  WITHOUT VALIDATION
  UPDATE GLOBAL INDEXES;

9
2017-10-22 08:29





经过更多的阅读和判断,由于缺乏对这个问题的答案,我得出的结论是,不可能刷新物化视图的单个分区。

如果您能给出一个证明其他方式的语法示例,我很乐意将您的答案标记为已接受的答案。

对于可能在将来发现这些问题有用的其他人:您可能还想知道在Oracle 10g中刷新分区(或任何mview)将导致Oracle发布 DELETE, 其次是 INSERT

如果这给您带来性能问题(比如我),可以选择使用 atomic_refresh => false,哪会 TRUNCATE, 然后 INSERT /*+APPEND*/


3
2018-01-20 19:07



为什么选择downvote? - Galghamon


我已经能够使用分区更改跟踪刷新物化视图的单个分区。

它似乎要求创建视图 REFRESH FAST WITH ROWID 选项和 DBMS_MVIEW.REFRESH 被称为 'P' 方法。


2
2017-08-04 13:35





您可以像使用普通表一样对物化视图进行分区。按日期对mview进行分区,然后只刷新所需的分区。


1
2017-11-23 14:11



请记住,Partitioning是Enterprise Edition许可证的额外费用。因此,请确保在投入生产之前获得许可。 - APC
你指的是分区变更跟踪吗?如果MV查询与所述的一样复杂,那么OP似乎可以利用它。 - David Aldridge
好的,但是我如何实际刷新一个分区呢?我似乎无法找到任何语法示例... - Galghamon