`
langzhiwang888
  • 浏览: 182030 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

Oracle物化视图定时全量刷新导致归档日志骤增

 
阅读更多
一、问题描述 
  某项目组来电,说有一个源表约2万多条的物化视图,每5分钟定时全量(Complete)刷新一次,一天下来,导致Oracle数据库归档日志骤增。 
 
二、问题分析及解决 
  先明确一个问题:归档日志(Archive Log)和重做日志(REDO Log)的关系。 
  Oracle的重做日志是一组(或几组)文件,按一定的规则顺序循环写,当重做日志写满后,从头开始写之前,如果数据库在归档模式(Archive),则在重写之前,需要把当前的重做日志进行归档(Archive),形成归档日志。即归档日志来自于重做日志。 
  基于此,可以通过减少产生重做日志的量来达到减少归档日志量的目的。 
 
  综合一下: 
  1、不要全量刷新,采用在源表上记录物化视图日志的方式,实现快速刷新,减少更新的数据量,达到减少重做日志的目的; 
  2、指定物化视图为nologging模式 
  3、减少或取消其上的索引(2W条记录,如果使用得比较频繁,甚至可以考虑把它cache到内存中) 
  4、如果一定要有索引,自己写刷新的Job,先disable索引,然后刷新,然后重建索引(唯一索引可能有问题)。 
  5、评估业务、技术要求,考虑取消物化视图,建立一般视图,在访问该视图时,直接从源表中查询。 
 
三、验证过程 
  验证全量刷新的物化视图产生的REDO日志的大小: 
-- 建立源表 
create table big_table as select * from dba_objects; 
 
-- 我机器上(11g),大概8W条记录 
select count(*) from big_table; 
 
/* 
  开始验证全量刷新产生的REDO日志的量 
*/ 
-- 建立物化视图 
create materialized view big_table_mv as select * from big_table; 
 
-- 查看目前REDO日志的量(重新启动数据库会自动清理) 
-- 记录下数值,用于接下来的比较 
select a.name, b.value from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';
--243964 
 
-- 手工全量刷新物化视图 
begin 
  dbms_mview.refresh( 'BIG_TABLE_MV', 'C' ); 
end; 
 
-- 再查看REDO日志的量,比较一下 
-- 记录下数值,用于接下来的比较 
select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size'; 
--value:38845196 
--diff:38601232,增加了约37M 
 
-- 还是比较可观的 
 
-- 把物化视图改为nologging模式 
alter table big_table_mv nologging; 
 
-- 再全量刷新 
begin 
  dbms_mview.refresh( 'BIG_TABLE_MV', 'C' ); 
end; 
 
-- 再查看REDO日志的量,比较一下 
-- 记录下数值,用于接下来的比较 
select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size'; 
--value:77495608 
--diff:38894376,增加了约37M,全量刷新时,指定nologging没有什么效果喔。 
 
-- 给物化视图建立索引 
create index big_table_mv_idx on big_table_mv(owner,object_type,object_name); 
 
-- 全量刷新 
begin 
  dbms_mview.refresh( 'BIG_TABLE_MV', 'C' ); 
end; 
 
-- 再查看REDO日志的量,比较一下 
select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size'; 
--value:166458592 
--diff:127564216,增加了约121M,索引的影响还是比较大的。 
 
-- 清理 
drop materialized view big_table_mv; 
drop table big_table purge; 
 
  可以发现: 
  1、全量刷新时,将产生较多的REDO,以上面的情况为例,如果该物化视图每5分钟刷新一次,则全天将产生约10656M(约10G,以不带索引,37M计算)的归档日志数据。 
  2、当该物化视图上有索引时,归档日志的数据将更大。 
 
  接下来再做一个验证,相同数据量,记录物化视图日志,快速刷新,每10秒更新源表中的数条记录。 
  重启数据库,清理REDO。 
  验证快速刷新的物化视图产生的REDO日志的大小: 
-- 建立源表 
create table big_table as select * from dba_objects; 
 
-- 我机器上(11g),大概8W条记录 
select count(*) from big_table; 
 
-- 建立物化视图日志 
create materialized view log on big_table with rowid including new values; 
 
/* 
  开始验证快速刷新产生的REDO日志的量 
*/ 
-- 建立物化视图,每10秒刷新一次 
create materialized view big_table_mv nologging 
refresh fast on demand 
with rowid 
START WITH TO_DATE('18-03-2011 10:09:08', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE + 1 / 8640  
as select * from big_table; 
 
-- 查看目前REDO日志的量(重新启动数据库会自动清理) 
-- 记录下数值,用于接下来的比较 
select a.name, b.value from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size';
--305808 
 
select count(*) from big_table t where t.owner = 'EPAPRD'; 
--937 
 
-- 每隔2秒钟,删除并重新插入1000条记录,执行100次吧。 
-- 共删除10万条,插入10万条。 
declare 
  i integer; 
begin 
  i := 1; 
  loop 
    delete from big_table t where t.owner = 'EPAPRD'; 
    insert into big_table select * from dba_objects o where o.OWNER = 'EPAPRD'; 
    commit; 
    dbms_lock.sleep(2); 
    i := i + 1; 
    exit when i > 100; 
  end loop; 
end; 
 
-- 再查看REDO日志的量,比较一下 
-- 记录下数值,用于接下来的比较 
select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size'; 
--value:126422824 
--diff:126117016,大约121M。 
 
-- 给物化视图建立索引 
create index big_table_mv_idx on big_table_mv(owner,object_type,object_name); 
 
-- 每隔2秒钟,删除并重新插入1000条记录,执行100次 
-- 共删除10万条,插入10万条。 
declare 
  i integer; 
begin 
  i := 1; 
  loop 
    delete from big_table t where t.owner = 'EPAPRD'; 
    insert into big_table select * from dba_objects o where o.OWNER = 'EPAPRD'; 
    commit; 
    dbms_lock.sleep(2); 
    i := i + 1; 
    exit when i > 100; 
  end loop; 
end; 
 
-- 再查看REDO日志的量,比较一下 
select a.name, b.value, to_char( b.value-&V, '999999999999' ) diff from v$statname a, v$mystat b where a.statistic# = b.statistic# and a.name = 'redo size'; 
--value:252701192 
--diff:126584176,大约121M。 
-- 为什么有索引和没有索引的REDO大小几乎没有差别?删除、插入数据时,都是要维护索引的呀。 
 
-- 清理 
drop materialized view big_table_mv; 
drop table big_table purge; 
 
  可以看出,快速刷新模式下,刷新100次,每次删除1000条、插入1000条记录,产生的REDO日志大小与1次全量刷新的大小小了很多。而且在生产环境中,想来不太可能有如果之多的操作,实际产生的REDO日志会更小。
分享到:
评论

相关推荐

    Oracle物化视图增量刷新的应用研究.pdf

    物化视图操作简单,支持增量刷新及全量刷新,可以支持复杂的表连接、聚合函数等操作,为数据的加工创建了便捷条件,提高了查询效率,减少了服务器消耗资源。 本文主要研究 Oracle 物化视图增量刷新的应用,揭示了...

    Oracle物化视图创建和使用

    在学习 Oracle 物化视图时,需要了解物化视图的概念、创建和删除物化视图、设置自动刷新时间和日志等知识点。同时,也需要了解物化视图的优点和缺点,以便更好地使用物化视图提高查询性能。 Oracle 物化视图的优点...

    Oracle物化视图应用详解

    - `REFRESH` 选项定义了刷新策略,如 `FORCE` 在每次查询时强制刷新,`FAST` 利用物化视图日志进行快速刷新,`COMPLETE` 是完全刷新,`NEVER` 表示不自动刷新。 - `ON COMMIT` 或 `ON DEMAND` 定义了刷新时机,`ON ...

    Oracle怎么根据物化视图日志快速刷新物化视图

    ### Oracle如何根据物化视图日志快速刷新物化视图 #### 一、物化视图及其日志介绍 在Oracle数据库中,物化视图(Materialized View)是一种特殊的对象,它存储了预计算查询的结果,从而可以提高查询性能。物化视图...

    物化视图的快速刷新

    物化视图的快速刷新 物化视图是 Oracle 中的一种性能优化技术,它可以将复杂的...物化视图的快速刷新是 Oracle 中的一种重要的性能优化技术,但它需要满足一些限制条件,否则不能进行快速刷新,影响了物化视图的性能。

    Oracle数据库中物化视图的原理剖析

    输出的脚本可能包括创建物化视图日志(Materialized View Log)的命令,物化视图日志是快速刷新机制的关键组成部分,它们记录源表的变化,以便物化视图能够追踪和更新。 总之,Oracle数据库中的物化视图是一种强大...

    oracle物化视图_循序渐进学习笔记

    例如,为了提高性能,可以启用物化视图的并行刷新,或者使用物化视图日志来追踪基表的更改,以便进行精确的增量刷新。同时,需要注意物化视图与基表之间的依赖关系,以及物化视图在数据库中的空间占用。 总之,...

    SQL 优化之 oracle物化视图

    1. FAST 子句:增量刷新,基于物化视图日志,用于发送主表已经修改的数据行到物化视图中。 2. COMPLETE 子句:完全刷新,重新生成整个视图。 3. FORCE 子句:当指定 FORCE 子句,如果增量刷新可用 Oracle 将完成增量...

    Oracle物化视图使用[文].pdf

    ON DEMAND模式意味着物化视图只在需要时(如用户手动触发或定时任务)进行刷新,以保持与基表数据的一致性。而ON COMMIT模式则更积极,一旦基表中的事务提交,物化视图就会立即刷新,确保数据即时更新。 创建一个ON...

    oracle 物化视图详解(内含例子)

    1. **ONDEMAND**:默认情况下,物化视图采用的是ONDEMAND模式,即只有当用户显式地请求刷新时,Oracle才会更新物化视图中的数据。这是一种最简单的创建方式,适用于数据变化不频繁或者对数据新鲜度要求不高的场景。 ...

    利用ORACLE物化视图建立报表数据库.pdf

    "利用ORACLE物化视图建立报表数据库.pdf" 本文主要介绍了利用ORACLE物化视图建立报表数据库的方法和原理。报表数据库是指独立于生产数据库的数据库,用于存储和管理报表数据。通过建立报表数据库,可以实现工作负荷...

    基于Oracle物化视图日志的数据同步技术研究.pdf

    Oracle物化视图日志是一种强大的数据同步技术,尤其适用于分布式数据库和分布式应用系统之间的数据一致性维护。在当今信息化系统中,随着技术的快速发展,数据的分布性和实时性需求日益增强,数据同步成为了一个关键...

    ORACLE9I物化视图

    ### ORACLE9I 物化视图 #### 执行概览 随着数据库技术的发展,无论是数据仓库、数据集市还是在线事务处理(OLTP)系统,都承载着大量的等待被发现和理解的信息。然而,在海量数据中及时准确地查找并呈现这些信息...

    ORACLE 物化视图 详解

    这种刷新方式不依赖于物化视图日志。 - **示例**: ```sql CREATE MATERIALIZED VIEW mv_emp_pk REFRESH COMPLETE ... ``` - **REFRESH FORCE**:根据当前条件选择最适合的刷新方式。如果增量刷新可用,则...

    oracle物化视图资料

    ### Oracle物化视图详解 #### 一、物化视图概述 Oracle物化视图是一种特殊类型的数据库对象,其核心功能在于预先计算并存储基于一个或多个表的查询结果,以此来加速后续的查询操作。与普通视图不同,普通视图在...

    ORACLE物化视图的技术应用.pdf

    4. **定时更新**:用户可以通过设置定时任务(job)来控制物化视图的刷新频率,确保数据的实时性。特别是当物化视图涉及远程数据库时,通过作业进行定期更新可以避免通信问题导致的数据延迟。 5. **数据复制**:在...

    oracle的物化视图

    Oracle的物化视图是一种数据库对象,它存储了查询结果,从而提供了一种高效的数据访问方式。物化视图的主要目标是提升查询性能,尤其是在处理复杂查询、连接操作或聚合计算时。它们在数据仓库环境中尤其有用,因为...

    oracle物化视图

    物化视图日志(mlog$_table_name)是物化视图刷新的基础,它记录了对原始表所做的更改,以供刷新时使用。通过查询物化视图日志,可以检查物化视图的更新状态。 除了物化视图的管理,文件还提到了Oracle数据集成工具...

Global site tag (gtag.js) - Google Analytics