可更新分区物化视图Issue

这个限制其实按照道理不应该存在,但是确实有这个问题,一个可更新的分区物化视图无法刷新会引起分区间记录转移的改动。这句话比较拗口,那么用例子说明一下。

创建一个分区表,注意要enable row movement,这样后面才能去更新分区键的字段值。

CREATE TABLE PARTITION_BY_RANGE ( FIRST_NAME    VARCHAR2(10),   MIDDLE_INIT    VARCHAR2(1),   LAST_NAME    VARCHAR2(10),   BIRTH_MM    INT NOT NULL,   BIRTH_DD    INT NOT NULL,   BIRTH_YYYY    INT NOT NULL) PARTITION BY RANGE (BIRTH_YYYY, BIRTH_MM, BIRTH_DD) (PARTITION DOBS_IN_1971_OR_BEFORE VALUES LESS THAN (1972, 01 ,01),  PARTITION DOBS_IN_1972           VALUES LESS THAN . . . → Read More: 可更新分区物化视图Issue

探讨实体化视图的刷新机制

今天给客户搭建历史查询服务器,用oracle8i的snapshot实现,也就是9i的实体化视图。

顺手做了一下trace,看了一下刷新时候oracle后台是怎么工作的。

前期准备,使用DBMS_SUPPORT包,这个包默认是没有安装的,需要运行下面的命令来手动安装。

SQL>conn / as sysdba SQL>@?\rdbms\admin\dbmssupp.sql SQL>GRANT execute ON dbms_support TO kamus; SQL>CREATE PUBLIC SYNONYM dbms_support FOR dbms_support;

先看快速刷新,测试表是T1,创建了快照日志,用于刷新的视图是MV_T1,用户是KAMUS

执行trace:

SQL>conn kamus SQL>exec dbms_support.start_trace(waits=>TRUE,binds=>TRUE); SQL>exec dbms_mview.refresh(list => ‘MV_T1′); SQL>exec dbms_support.stop_trace;

然后tkprof生成trace结果的报表,下面只是节选了其中一部分。

执行一次dbms_mview.refresh,Oracle后台会执行13个 user SQL和92个 internal SQL,实在是一个繁杂的工作。

1。开始刷新

BEGIN dbms_mview.refresh(list => ‘MV_T1′); END;

2。检查SNAP$表,确认当前用户是否有需要刷新的视图

3。在DBMS_LOCK_ALLOCATED数据字典中更新记录,设置过期时间

UPDATE DBMS_LOCK_ALLOCATED SET EXPIRATION = SYSDATE + (:B1 /86400) WHERE . . . → Read More: 探讨实体化视图的刷新机制

最简单的创建复制环境中只读实体化视图站点的方法

目的:创建一个实体化视图站点,定时刷新,获取主站点中指定表的变化,这个实体化站点可以作为查询服务器使用

步骤:

1。主站点上创建实体化视图日志表

CREATE MATERIALIZED VIEW LOG ON kamus.account2004;

2。实体化视图站点上创建公用数据库链接

conn system/password   CREATE PUBLIC DATABASE LINK orcl using ‘ORCL’;

3。实体化视图站点上创建刷新组,本例中3分钟刷新一次

conn system/password   BEGIN    DBMS_REFRESH.MAKE (       name => ‘kamus.test_repg’,       list => ”,       next_date => SYSDATE,       interval => ‘SYSDATE + 3/(24*60)’,     . . . → Read More: 最简单的创建复制环境中只读实体化视图站点的方法