–创建基表
create table hr.t1 (
id number(10),
name1 varchar2(10),
name2 varchar2(10),
name3 varchar2(10)
);
insert into hr.t1 values (1,’a',’b',’c');
insert into hr.t1 values (1,’a',’b',’c');
insert into hr.t1 values (1,’a',’b',’c');
insert into hr.t1 values (2,’a',’b',’c');
insert into hr.t1 values (2,’a',’b',’c');
insert into hr.t1 values (2,’a',’b',’c');
insert into hr.t1 values (3,’a',’b',’c');
insert into hr.t1 values (1,’a',’b',’c');
insert into hr.t1 values (1,’a',’b',’c');
commit;
SQL> select rowid, id, name1, name2, name3 from hr.t1;
ROWID ID NAME1 NAME2 NAME3
—————— ———- ———- ———- ———-
AAANxRAAHAAAESsAAA 1 a b c
AAANxRAAHAAAESsAAB 1 a b c
AAANxRAAHAAAESsAAC 1 a b c
AAANxRAAHAAAESsAAD 2 a b c
AAANxRAAHAAAESsAAE 2 a b c
AAANxRAAHAAAESsAAF 2 a b c
AAANxRAAHAAAESsAAG 3 a b c
AAANxRAAHAAAESsAAH 1 a b c
AAANxRAAHAAAESsAAI 1 a b c
9 rows selected.
–创建物化视图
CREATE MATERIALIZED VIEW hr.t1_mv
BUILD IMMEDIATE
REFRESH COMPLETE
ENABLE QUERY REWRITE AS
SELECT id, name1, name2, name3
FROM t1;
drop materialized view t1_mv;
–更新id=1的第三条记录的值
update hr.t1 set id=4 where rowid=’AAANxRAAHAAAESsAAC’;
exec DBMS_MVIEW.REFRESH(‘HR.T1_MV’, ‘C’, ”, TRUE, FALSE, 0,0,0, FALSE);
SQL> select * from t1_mv;
ID NAME1 NAME2 NAME3
———- ———- ———- ———-
1 a b c
1 a b c
4 a b c
2 a b c
2 a b c
2 a b c
3 a b c
1 a b c
1 a b c
–更新成功
–说明物化视图在基于ROWID更新基表之后,通过全量刷新是可以更新物化视图
VARIABLE task_cust_mv VARCHAR2(30);
VARIABLE create_mv_ddl VARCHAR2(4000);
EXECUTE :task_cust_mv := ‘t1_mv2′;
EXECUTE :create_mv_ddl := ‘ CREATE MATERIALIZED VIEW t1_mv2 REFRESH FAST DISABLE QUERY REWRITE AS SELECT id, name1, name2, name3 FROM t1′;
EXECUTE DBMS_ADVISOR.TUNE_MVIEW(:task_cust_mv, :create_mv_ddl);
ERROR at line 1:
ORA-13600: error encountered in Advisor
QSM-03113: Cannot tune the MATERIALIZED VIEW statement
QSM-02180: no primary key constraint in the master table
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86
ORA-06512: at "SYS.PRVT_ACCESS_ADVISOR", line 202
ORA-06512: at "SYS.PRVT_TUNE_MVIEW", line 1232
ORA-06512: at "SYS.DBMS_ADVISOR", line 753
ORA-06512: at line 1
–无法支持快速刷新,如果创建主键,就失去基于ROWID更新的必要性
创建基于ROWID的物化视图,并测试快速更新方式
VARIABLE task_cust_mv VARCHAR2(30);
VARIABLE create_mv_ddl VARCHAR2(4000);
EXECUTE :task_cust_mv := ‘t1_mv2′;
EXECUTE :create_mv_ddl := ‘CREATE MATERIALIZED VIEW t1_mv2 BUILD IMMEDIATE REFRESH FAST WITH ROWID ENABLE QUERY REWRITE AS SELECT id, name1, name2, name3 FROM t1′;
EXECUTE DBMS_ADVISOR.TUNE_MVIEW(:task_cust_mv, :create_mv_ddl);
SQL> set long 999999
SQL> SELECT STATEMENT FROM USER_TUNE_MVIEW;
CREATE MATERIALIZED VIEW LOG ON "HR"."T1" WITH ROWID;
ALTER MATERIALIZED VIEW LOG FORCE ON "HR"."T1" ADD ROWID;
CREATE MATERIALIZED VIEW HR.T1_MV2
BUILD IMMEDIATE
REFRESH FAST WITH ROWID
ENABLE QUERY REWRITE AS
SELECT id, name1, name2, name3
FROM t1;
DROP MATERIALIZED VIEW HR.T1_MV2;
SQL> select rowid, id, name1, name2, name3 from t1;
ROWID ID NAME1 NAME2 NAME3
—————— ———- ———- ———- ———-
AAANxRAAHAAAESsAAA 1 a b c
AAANxRAAHAAAESsAAB 1 a b c
AAANxRAAHAAAESsAAC 4 a b c
AAANxRAAHAAAESsAAD 2 a b c
AAANxRAAHAAAESsAAE 2 a b c
AAANxRAAHAAAESsAAF 2 a b c
AAANxRAAHAAAESsAAG 3 a b c
AAANxRAAHAAAESsAAH 1 a b c
AAANxRAAHAAAESsAAI 1 a b c
–修改id=2 的第二行记录
SQL> update t1 set name1=’z’ where rowid=’AAANxRAAHAAAESsAAE’;
1 row updated.
SQL> commit;
Commit complete.
SQL> select rowid, id, name1, name2, name3 from t1;
ROWID ID NAME1 NAME2 NAME3
—————— ———- ———- ———- ———-
AAANxRAAHAAAESsAAA 1 a b c
AAANxRAAHAAAESsAAB 1 a b c
AAANxRAAHAAAESsAAC 4 a b c
AAANxRAAHAAAESsAAD 2 a b c
AAANxRAAHAAAESsAAE 2 z b c
AAANxRAAHAAAESsAAF 2 a b c
AAANxRAAHAAAESsAAG 3 a b c
AAANxRAAHAAAESsAAH 1 a b c
AAANxRAAHAAAESsAAI 1 a b c
9 rows selected.
SQL> select * from t1_mv2;
ID NAME1 NAME2 NAME3
———- ———- ———- ———-
1 a b c
1 a b c
4 a b c
2 a b c
2 a b c
2 a b c
3 a b c
1 a b c
1 a b c
9 rows selected.
exec DBMS_MVIEW.REFRESH(‘HR.T1_MV2′, ‘F’, ”, TRUE, FALSE, 0,0,0, FALSE);
–验证MV的特性
SQL> @?/rdbms/admin/utlxmv.sql
SQL> EXECUTE DBMS_MVIEW.EXPLAIN_MVIEW (‘HR.T1_MV2′);
PL/SQL procedure successfully completed.
SQL> SELECT capability_name,
2 possible
3 from mv_capabilities_table
4 order by seq;
CAPABILITY_NAME P
—————————— –
PCT N
REFRESH_COMPLETE Y
REFRESH_FAST Y
REWRITE Y
PCT_TABLE N
REFRESH_FAST_AFTER_INSERT Y
REFRESH_FAST_AFTER_ONETAB_DML Y
REFRESH_FAST_AFTER_ANY_DML Y
REFRESH_FAST_PCT N
REWRITE_FULL_TEXT_MATCH Y
REWRITE_PARTIAL_TEXT_MATCH Y
CAPABILITY_NAME P
—————————— –
REWRITE_GENERAL Y
REWRITE_PCT N
PCT_TABLE_REWRITE N
14 rows selected.
SQL> select * from t1_mv2;
ID NAME1 NAME2 NAME3
———- ———- ———- ———-
1 a b c
1 a b c
4 a b c
2 a b c
2 z b c
2 a b c
3 a b c
1 a b c
1 a b c
9 rows selected.
–实现