我有这样定义的物化视图:
CREATE MATERIALIZED VIEW M_FOO
REFRESH COMPLETE ON COMMIT
AS
SELECT FOO_ID, BAR
FROM FOO
WHERE BAR IS NOT NULL
GROUP BY FOO_ID, BAR
/
COMMENT ON MATERIALIZED VIEW M_FOO IS 'Foo-Bar pairs';
我写的是一种缓存:源表很大但不同对的数量相当小。我需要这些对来让他们与其他表联系起来。到目前为止一切都很好:它绝对可以加速查询。
但我想确保视图不包含过时的数据。基础表每月修改四到五次,但我不一定知道何时。我知道可以定义物化视图,以便在源表更改时更新。但是,文档变得非常复杂。
我需要的确切语法是什么 使用
我是否需要创建物化 查看日志?
快速之间有什么区别 并完成刷新?
答案 0 :(得分:19)
以相反的顺序提出问题
FAST刷新也称为增量刷新。这应该会给你一个关于差异的线索。 COMPLETE刷新从头开始重建整个MVIEW,而FAST刷新仅应用DML对进纸器表的更改。
为了执行FAST刷新,您需要相应的MVIEW LOG。
至于语法,这里有基础知识:
SQL> create materialized view log on emp
2 with rowid, primary key, sequence (deptno, job)
3 including new values
4 /
Materialized view log created.
SQL> create materialized view emp_mv
2 refresh fast on commit
3 as
4 select deptno, job from emp
5 group by deptno, job
6 /
Materialized view created.
SQL>
ON COMMIT
子句意味着MVIEW以事务方式刷新(而不是ON DEMAND
,这是批量定期刷新)。 REFRESH
子句指定是应用增量还是完全刷新。有一些类别的查询强制使用COMPLETE
刷新,尽管每个新版本的Oracle似乎都会减少。
快速测试,看它是否有效......
SQL> select * from emp_mv
2 order by deptno, job
3 /
DEPTNO JOB
---------- ---------
10 MANAGER
10 PRESIDENT
10 SALES
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
40 CLERK
40 DOGSBODY
11 rows selected.
SQL>
新记录怎么样?
SQL> insert into emp (empno, ename, deptno, job)
2 values (6666, 'GADGET', 40, 'INSPECTOR')
3 /
1 row created.
SQL> commit
2 /
Commit complete.
SQL> select * from emp_mv
2 order by deptno, job
3 /
DEPTNO JOB
---------- ---------
10 MANAGER
10 PRESIDENT
10 SALES
20 ANALYST
20 CLERK
20 MANAGER
30 CLERK
30 MANAGER
30 SALESMAN
40 CLERK
40 DOGSBODY
40 INSPECTOR
12 rows selected.
SQL>
您可以在the SQL Reference中找到有关语法的更多详细信息。它也值得阅读Materialized View chapter in the Data Warehousing Guide。
答案 1 :(得分:8)
快速刷新只会将更改的数据插入/更新/删除到物化视图中。完整刷新将清空实体化视图,然后复制所有行。
“on commit”表示只要在主表中提交更改,就会刷新实例化视图。因此,您当前的语法将非常低效。每当有人更改foo中的任何行时,m_foo将被截断,然后将插入foo表中的每一行。
快速刷新可以做得更好,只有foo中修改过的行才会被发送到m_foo。这样可以保证一致性而不会产生大量开销
使用主键在foo上创建物化视图日志; - 假设你有一个主键,你应该 创建物化视图m_foo在提交时快速刷新为\;
如果您正在使用数据库链接,或者拥有foo的模式不是拥有m_foo的模式,则还有一些额外的细微差别,包括授权和同义词。