materialized log

来源:互联网 发布:qq宠物软件 编辑:程序博客网 时间:2024/05/19 15:19

创建一个部门表的物化视图,由于部门表变动不频繁,而且需要实时反映出部门表的变动,所以采用了fast refresh。语句如下

CREATE MATERIALIZED VIEW dept_mv
   BUILD IMMEDIATE
   REFRESH FAST ON COMMIT
   ENABLE QUERY REWRITE
   as
select dept.rowid      d_rowid,
       dept.fid        deptId,
        smallRegion.Fid smallId,
       bigRegion.Fid bigRegionId,
       smallRegion.Fid smallId,
       smallRegion.Fid smallId
  from dpcrm.t_org_department dept
  join dpcrm.t_org_department smallRegion on dept.fparentid =
                                             smallRegion.Fid
  join dpcrm.t_org_department bigRegion on smallRegion.Fparentid =
                                           bigRegion.fid
  join dpcrm.t_org_department busiDept on bigRegion.Fparentid =
                                          busiDept.fid
  join dpcrm.t_org_department busiGroup on busiDept.Fparentid =
                                           busiGroup.fid
 where dept.fstandardcode is not null
   and dept.fstatus = 1
   and dept.fdeptname like '%营业部'

提示:ora-12054:无法为实体化视图设置on commit刷新属性

原因:快速刷新不同于全量刷新,需要在物化视图中使用的实体表上创建物化视图日志(materialized log)

物化视图日志作用:用来快速刷新物化视图。

complete refresh(全量刷新):重新执行一遍创建物化视图的select 语句。特点是比较慢,但是简单。这么看,物化视图日志好像没啥作用,事实是,使用全量刷新的确没有必要创建物化视图日志。

fast refresh(快速刷新或增量刷新):这种刷新方式下,当使用DML语句操作基表时,DB会首先将change写入物化视图日志,然后根据日志去快速刷新视图。至于具体怎么快速刷新要看创建日志的具体选项了。

synchronous refresh(同步刷新):这种刷新方式,当使用DML语句操作基表时,首先是写入一种类型叫staging log的物化视图日志。然后DB同事将change写入到主表和物化视图中,这样就保证了物化视图中的数据与主表数据完全一致。

因此可见,后两种方式都需要使用物化视图日志。这样就可以理解,我创建快速刷新的物化视图错误是由于我没有创建对应的物化视图日志。

既然知道原因了就创建日志吧。下面来具体分析一下创建日志的语法。


create materialized view log on 【table_name】:这部分语法是定死了,指定了给哪张表创建日志,由于物化视图日志被DB所管理,所以不需要名字?为什么不需要名字不知道,反正不用命名。

接下来的一大串都是可选选项,因为一般都有默认值。

physical_attributes_clause:这个字句是用来配置一些存储特性,一般使用默认值就可以了

initrans:单个数据块上能允许的最大事务数量。表默认是1,index默认是2 最大255

pctused:重启insert操作阀值 default:40%

pctfree:预留给update操作的最小空间 default:10%

tablespace:指定表空间。因为日志也需要物理存储。默认为当前schame所属的tablespace

logging_clause:设定是否需要在redo段记录该操作日志。logging记录,nologging不记录。某人与表空间一致

cache/nocache:数据库默认采用LRU算法管理缓存,如果制定了cache那么就使用MRU替换LRU算法来管理内存

parallel_clause:配置数据库并行度。

noparallel:不允许并行

parallel:允许并行,并行度为PARALLEL_THREADS_PER_CPU 参数指定的。

parallel 【number】:手动指定并行度

table_partitioning_clause:参照表分区语法。进行log分区

with:这个是比较有用的部分

OBJECT_ID:对于对象表,所有object_id有变动的都记录到log

primary key:对于存储表,所有主键有变动的都记录到log

rowid:对于所有rowid有变动的记录到log

sequence:在一个高并发的系统中,对同一行记录可能会存在并发的操作,为了保证刷新到物化视图中的顺序和操作顺序一致,所以加额外的sequence列来标识操作的先后顺序。

commit scn:不指定的话就使用timestamp来作为刷新的标准,但是使用时间戳会有额外的负担,具体我也不知道是什么。所以建议使用commit scn刷新会比较快。但是有一些限制条件。对于存在lob列的表不能使用,使用了commit scn就不能使用同步刷新(synchronous refresh)。

(columns):除了primary key,object_id,rowid还可以将其他一些列保存到log中,以便于在刷新是快速定位数据行。例如,筛选的列和join列

new_value_clause:是否记录新值,默认不记录

including new value:在log中记录新值和旧值,如果希望使用fast refresh就一定要指定

excluding new value:在log中不记录新值

mv_log_purge_clause:指定清楚物化视图日志的时间,默认刷新后立即清除log,一般用默认值就好了。

for_refresh_clause:指定物化视图日志刷新方式。

for synchronous refresh:使用同步刷新方式

for fast refresh:使用快速刷新方式

--创建物化视图日志demo

create materialized view log on dpcrm.t_org_department 
       with primary key, 
       sequence (fparentid), 
       commit scn 
       INCLUDING NEW VALUES;

创建了日志之后,创建物化视图还是报错,详情物化视图:http://blog.csdn.net/shengsummer/article/details/44781733





0 0
原创粉丝点击