当urderlying表更改时更新物化视图

Álv*_*lez 11 oracle materialized-views oracle10g

我有这样定义的物化视图:

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';
Run Code Online (Sandbox Code Playgroud)

我写的是一种缓存:源表很大但不同对的数量相当小.我需要这些对来让他们与其他表联系起来.到目前为止一切都很好:它绝对可以加速查询

但我想确保视图不包含过时的数据.基础表每月修改四到五次,但我不一定知道何时.我知道可以定义物化视图,以便在源表更改时更新.但是,文档变得相当复杂.

  1. 我需要使用的确切语法是什么?

  2. 我是否需要创建物化视图日志?

  3. 快速刷新和完全刷新之间有什么区别?

APC*_*APC 20

以相反的顺序提出问题

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

新记录怎么样?

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>
Run Code Online (Sandbox Code Playgroud)

您可以在SQL Reference中找到有关语法的更多详细信息.还值得阅读"数据仓库指南"中的 " 物化视图"一章.


Jim*_*son 8

快速刷新仅将更改的数据插入/更新/删除到物化视图中.完整刷新将清空实体化视图,然后复制所有行.

"on commit"表示只要在主表中提交更改,就会刷新实例化视图.因此,您当前的语法将非常低​​效.每当有人更改foo中的任何行时,m_foo将被截断,然后将插入foo表中的每一行.

您可以通过快速刷新做得更好,其中只有foo中的修改行将被发送到m_foo.这样可以保证一致性而不会产生大量开销

使用主键创建物理视图登录foo; - 假设您有一个主键,您应该在提交时快速创建物化视图m_foo刷新为\;

如果您使用数据库链接,或者拥有foo的模式不是拥有m_foo的模式,则还有一些额外的细微差别,包括授权和同义词.