一、问题描述
某项目组来电,说有一个源表约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 物化视图增量刷新的应用,揭示了...
在学习 Oracle 物化视图时,需要了解物化视图的概念、创建和删除物化视图、设置自动刷新时间和日志等知识点。同时,也需要了解物化视图的优点和缺点,以便更好地使用物化视图提高查询性能。 Oracle 物化视图的优点...
- `REFRESH` 选项定义了刷新策略,如 `FORCE` 在每次查询时强制刷新,`FAST` 利用物化视图日志进行快速刷新,`COMPLETE` 是完全刷新,`NEVER` 表示不自动刷新。 - `ON COMMIT` 或 `ON DEMAND` 定义了刷新时机,`ON ...
### Oracle如何根据物化视图日志快速刷新物化视图 #### 一、物化视图及其日志介绍 在Oracle数据库中,物化视图(Materialized View)是一种特殊的对象,它存储了预计算查询的结果,从而可以提高查询性能。物化视图...
物化视图的快速刷新 物化视图是 Oracle 中的一种性能优化技术,它可以将复杂的...物化视图的快速刷新是 Oracle 中的一种重要的性能优化技术,但它需要满足一些限制条件,否则不能进行快速刷新,影响了物化视图的性能。
输出的脚本可能包括创建物化视图日志(Materialized View Log)的命令,物化视图日志是快速刷新机制的关键组成部分,它们记录源表的变化,以便物化视图能够追踪和更新。 总之,Oracle数据库中的物化视图是一种强大...
例如,为了提高性能,可以启用物化视图的并行刷新,或者使用物化视图日志来追踪基表的更改,以便进行精确的增量刷新。同时,需要注意物化视图与基表之间的依赖关系,以及物化视图在数据库中的空间占用。 总之,...
1. FAST 子句:增量刷新,基于物化视图日志,用于发送主表已经修改的数据行到物化视图中。 2. COMPLETE 子句:完全刷新,重新生成整个视图。 3. FORCE 子句:当指定 FORCE 子句,如果增量刷新可用 Oracle 将完成增量...
ON DEMAND模式意味着物化视图只在需要时(如用户手动触发或定时任务)进行刷新,以保持与基表数据的一致性。而ON COMMIT模式则更积极,一旦基表中的事务提交,物化视图就会立即刷新,确保数据即时更新。 创建一个ON...
1. **ONDEMAND**:默认情况下,物化视图采用的是ONDEMAND模式,即只有当用户显式地请求刷新时,Oracle才会更新物化视图中的数据。这是一种最简单的创建方式,适用于数据变化不频繁或者对数据新鲜度要求不高的场景。 ...
"利用ORACLE物化视图建立报表数据库.pdf" 本文主要介绍了利用ORACLE物化视图建立报表数据库的方法和原理。报表数据库是指独立于生产数据库的数据库,用于存储和管理报表数据。通过建立报表数据库,可以实现工作负荷...
Oracle物化视图日志是一种强大的数据同步技术,尤其适用于分布式数据库和分布式应用系统之间的数据一致性维护。在当今信息化系统中,随着技术的快速发展,数据的分布性和实时性需求日益增强,数据同步成为了一个关键...
### ORACLE9I 物化视图 #### 执行概览 随着数据库技术的发展,无论是数据仓库、数据集市还是在线事务处理(OLTP)系统,都承载着大量的等待被发现和理解的信息。然而,在海量数据中及时准确地查找并呈现这些信息...
这种刷新方式不依赖于物化视图日志。 - **示例**: ```sql CREATE MATERIALIZED VIEW mv_emp_pk REFRESH COMPLETE ... ``` - **REFRESH FORCE**:根据当前条件选择最适合的刷新方式。如果增量刷新可用,则...
### Oracle物化视图详解 #### 一、物化视图概述 Oracle物化视图是一种特殊类型的数据库对象,其核心功能在于预先计算并存储基于一个或多个表的查询结果,以此来加速后续的查询操作。与普通视图不同,普通视图在...
4. **定时更新**:用户可以通过设置定时任务(job)来控制物化视图的刷新频率,确保数据的实时性。特别是当物化视图涉及远程数据库时,通过作业进行定期更新可以避免通信问题导致的数据延迟。 5. **数据复制**:在...
Oracle的物化视图是一种数据库对象,它存储了查询结果,从而提供了一种高效的数据访问方式。物化视图的主要目标是提升查询性能,尤其是在处理复杂查询、连接操作或聚合计算时。它们在数据仓库环境中尤其有用,因为...
物化视图日志(mlog$_table_name)是物化视图刷新的基础,它记录了对原始表所做的更改,以供刷新时使用。通过查询物化视图日志,可以检查物化视图的更新状态。 除了物化视图的管理,文件还提到了Oracle数据集成工具...