oracle物化视图(materialized view)刷新有3种方式:
完全刷新(complete):刷新所有数据。
快速刷新(fast):刷新自上次刷新以来变化的数据。
强制刷新(force):能快速刷新则快速刷新,否则完全刷新。这也是默认的刷新方式。
快速刷新
快速刷新要求必须在基表上创建物化视图日志(materialized view log),例如:
create materialized view log on test with primary key;
然后创建物化视图,例如:
create materialized view mv_test refresh fast as select * from test;
默认情况下会自动在物化视图上创建索引,提高查询速度,但如果刷新频繁的情况下,可以考虑不创建索引,例如:
create materialized view mv_test using no index refresh fast as select * from test;
完全刷新
完全刷新则不需要创建物化视图日志,完全刷新默认先将物化视图的数据delete,然后再insert,注意:这样在数据量较大时,会产生大量的redo,同样会占用undo空间。
DBMS_MVIEW.REFRESH()
DBMS_MVIEW.REFRESH ( { list IN VARCHAR2, | tab IN DBMS_UTILITY.UNCL_ARRAY,} method IN VARCHAR2 := NULL, rollback_seg IN VARCHAR2 := NULL, push_deferred_rpc IN BOOLEAN := true, refresh_after_errors IN BOOLEAN := false, purge_option IN BINARY_INTEGER := 1, parallelism IN BINARY_INTEGER := 0, heap_size IN BINARY_INTEGER := 0, atomic_refresh IN BOOLEAN := true, nested IN BOOLEAN := false);
这是oracle自带的过程,用来刷新物化视图,例如:
exec dbms_mview.refresh('MV_TEST')
这个过程有几个参数特别说明一下:
method:指定物化视图的刷新方式,可以覆盖创建物化视图时的刷新方式。'c'代表完全刷新,'f'代表快速刷新。例如:
exec dbms_mview.refresh('MV_TEST','c')
atomic_refresh:可以指定在进行完全刷新时,清空物化视图的数据的方式。例如:
exec dbms_mview.refresh('MV_TEST','c',atomic_refresh => true) --默认值,清空数据的方式为 delete
exec dbms_mview.refresh('MV_TEST','c',atomic_refresh => false) --清空数据的方式为 truncate,如果有索引则自动重建
延伸
创建物化视图日志是快速刷新的必要条件,但是即使创建了物化视图日志也不能保证物化视图一定可以快速刷新,可以使用以下方式分析是否可以快速刷新:
1/
CREATE TABLE MV_CAPABILITIES_TABLE (
STATEMENT_ID VARCHAR(30),
MVOWNER VARCHAR(30),
MVNAME VARCHAR(30),
CAPABILITY_NAME VARCHAR(30),
POSSIBLE CHARACTER(1),
RELATED_TEXT VARCHAR(2000),
RELATED_NUM NUMBER,
MSGNO INTEGER,
MSGTXT VARCHAR(2000),
SEQ NUMBER
);
2/
EXEC DBMS_MVIEW.EXPLAIN_MVIEW('TEST');
3/
SELECT SEQ,CAPABILITY_NAME,POSSIBLE,MSGTXT FROM MV_CAPABILITIES_TABLE ORDER BY SEQ;