我觉得这个问题很清楚,但仍然是一个例子:
假设我有一个名为“MY_MATERIALIZED_VIEW”的MV,使用
创建CREATE MATERIALIZED VIEW MY_MATERIALIZED_VIEW PARALLEL PARTITION BY RANGE (some_date)
(
PARTITION RESULT_MATRIX_V_2012 VALUES LESS THAN (TO_DATE('01/01/2013','dd/MM/yyyy')),
PARTITION RESULT_MATRIX_V_2013 VALUES LESS THAN (TO_DATE('01/01/2014','dd/MM/yyyy')),
PARTITION RESULT_MATRIX_V_2017 VALUES LESS THAN (MAXVALUE)
)
NOCOMPRESS
LOGGING
BUILD DEFERRED
USING INDEX TABLESPACE XXISLT_INDEX
REFRESH FAST ON COMMIT
USING DEFAULT LOCAL ROLLBACK SEGMENT
DISABLE QUERY REWRITE AS
SELECT c1,c2
FROM SOME_TABLE;
然后我执行
EXEC DBMS_MVIEW.REFRESH('MY_MATERIALIZED_VIEW','C');
现在让我们说最后一条指令需要大约4个小时才能完成,在此之前我会尝试这样做
update SOME_TABLE SET c1 = 4 where c2 = 6;
会发生什么? SOME_TABLE被阻止了吗? 我怀疑是因为我没有找到任何明确的文件,
问候,
答案 0 :(得分:0)
更新会成功。
物化视图刷新就像任何其他阅读器进程一样。从表中读取的进程不会阻止任何其他会话读取该表中的数据。就像任何其他阅读器一样,物化视图将看到插入操作开始时存在的数据。换句话说,物化视图将反映更新之前的数据。
当然,如果您实际创建了所描述的物化视图,则不需要调用dbms_mview.refresh
,因为它已设置为刷新时提交。由于您可以进行增量刷新,因此在这样的物化视图上进行完全刷新通常没有多大意义。如果您能够创建物化视图,则意味着您在some_table
上有物化视图日志,在这种情况下,刷新过程通常会使用物化视图日志中的数据而不是表中的数据