
Oracle 10g R2特性之数据仓库和集成特性
发布时间:2006-08-08 12:01:06 来源:Oracle技术网 网友评论 0 条
分区更改跟踪:不需要 MV 日志
要了解此增强功能,首先必须了解物化视图 (MV) 刷新过程中的分区修整概念。
假设基于列 ACC_MGR_ID 对表 ACCOUNTS 进行了分区,每个 ACC_MGR_ID 值一个分区。您根据 ACCOUNTS 创建了一个名为 ACC_VIEW 的 MV,该 MV 也根据列 ACC_MGR_ID 进行了分区,每个 ACC_MGR_ID 一个分区,如下图所示:
假设已经更新了表 ACCOUNTS 中的记录,但只在分区 P1 中进行了此更新。要快速刷新此 MV,您只需刷新分区 P1 而非整个表,这里正是与 ACC_MGR_ID 相关的数据所在的分区。Oracle 自动执行此任务,通过一个名为分区更改跟踪 (PCT) 的特性跟踪对分区的更改。但有一个问题需稍加注意:要在快速刷新的过程中启用 PCT,必须创建 MV 日志,当表中的行发生变化会填充这些日志。发出刷新命令后,刷新进程将读取 MV 日志以识别这些更改。
不用说,该要求增加了操作的总执行时间。此外,附加的插入操作将消耗 CPU 周期和 I/O 带宽。
幸好,在 Oracle 数据库 10g 第 2 版中,PCT 不需要 MV 日志即可工作。让我们看一看它的作用方式。首先,确认表 ACCOUNTS 中没有 MV 日志。
SQL> select * 2 from dba_mview_logs 3 where master = 'ACCOUNTS'; no rows selected
现在,更新该表中的某个记录。
update accounts set last_name = '...' where acc_mgr_id = 3;
该记录位于分区 P3 中。
现在,您就可以刷新此 MV 了。但首先记录表 ACCOUNTS 所有段的段级统计信息。稍后,您将使用这些统计信息了解使用了哪些段。
select SUBOBJECT_NAME, value from v$segment_statistics where owner = 'ARUP' and OBJECT_NAME = 'ACCOUNTS' and STATISTIC_NAME = 'logical reads' order by SUBOBJECT_NAME / SUBOBJECT_NAME VALUE ------------------------------ ---------- P1 8320 P10 8624 P2 12112 P3 11856 P4 8800 P5 7904 P6 8256 P7 8016 P8 8272 P9 7840 PMAX 256 11 rows selected.
使用快速刷新刷新物化视图 ACC_VIEW。
execute dbms_mview.refresh('ACC_VIEW','F')
'F' 参数指示快速刷新。但如果表没有 MV 日志,它是否可以起作用?
刷新完成后,再次检查表 ACCOUNTS 的段统计信息。结果如下所示:
SUBOBJECT_NAME VALUE ------------------------------ ---------- P1 8320 P10 8624 P2 12112 P3 14656 P4 8800 P5 7904 P6 8256 P7 8016 P8 8272 P9 7840 PMAX 256
这些段统计信息显示了在一个逻辑读取过程中选择的段。由于这些统计信息是累积的,因此您必须查看值(而非绝对值)中的更改。如果仔细查看以上值,您便会发现只有分区 P3 的值发生了变化。因此,在刷新过程中只选择了分区 P3 而非整个表,确认 PCT 能否在表即使没有 MV 日志的情况下工作。
即使在基表没有 MV 日志的情况下也可以快速刷新 MV 的能力是一个强大而有用的特性,从而允许您可以在已分区的 MV 中执行快速刷新而不会增加性能开销。我认为,该特性是 Oracle 数据库 10g 第 2 版中最有用的数据仓库增强功能。
要了解此增强功能,首先必须了解物化视图 (MV) 刷新过程中的分区修整概念。
假设基于列 ACC_MGR_ID 对表 ACCOUNTS 进行了分区,每个 ACC_MGR_ID 值一个分区。您根据 ACCOUNTS 创建了一个名为 ACC_VIEW 的 MV,该 MV 也根据列 ACC_MGR_ID 进行了分区,每个 ACC_MGR_ID 一个分区,如下图所示:
假设已经更新了表 ACCOUNTS 中的记录,但只在分区 P1 中进行了此更新。要快速刷新此 MV,您只需刷新分区 P1 而非整个表,这里正是与 ACC_MGR_ID 相关的数据所在的分区。Oracle 自动执行此任务,通过一个名为分区更改跟踪 (PCT) 的特性跟踪对分区的更改。但有一个问题需稍加注意:要在快速刷新的过程中启用 PCT,必须创建 MV 日志,当表中的行发生变化会填充这些日志。发出刷新命令后,刷新进程将读取 MV 日志以识别这些更改。
不用说,该要求增加了操作的总执行时间。此外,附加的插入操作将消耗 CPU 周期和 I/O 带宽。
幸好,在 Oracle 数据库 10g 第 2 版中,PCT 不需要 MV 日志即可工作。让我们看一看它的作用方式。首先,确认表 ACCOUNTS 中没有 MV 日志。
SQL> select * 2 from dba_mview_logs 3 where master = 'ACCOUNTS'; no rows selected
现在,更新该表中的某个记录。
update accounts set last_name = '...' where acc_mgr_id = 3;
该记录位于分区 P3 中。
现在,您就可以刷新此 MV 了。但首先记录表 ACCOUNTS 所有段的段级统计信息。稍后,您将使用这些统计信息了解使用了哪些段。
select SUBOBJECT_NAME, value from v$segment_statistics where owner = 'ARUP' and OBJECT_NAME = 'ACCOUNTS' and STATISTIC_NAME = 'logical reads' order by SUBOBJECT_NAME / SUBOBJECT_NAME VALUE ------------------------------ ---------- P1 8320 P10 8624 P2 12112 P3 11856 P4 8800 P5 7904 P6 8256 P7 8016 P8 8272 P9 7840 PMAX 256 11 rows selected.
使用快速刷新刷新物化视图 ACC_VIEW。
execute dbms_mview.refresh('ACC_VIEW','F')
'F' 参数指示快速刷新。但如果表没有 MV 日志,它是否可以起作用?
刷新完成后,再次检查表 ACCOUNTS 的段统计信息。结果如下所示:
SUBOBJECT_NAME VALUE ------------------------------ ---------- P1 8320 P10 8624 P2 12112 P3 14656 P4 8800 P5 7904 P6 8256 P7 8016 P8 8272 P9 7840 PMAX 256
这些段统计信息显示了在一个逻辑读取过程中选择的段。由于这些统计信息是累积的,因此您必须查看值(而非绝对值)中的更改。如果仔细查看以上值,您便会发现只有分区 P3 的值发生了变化。因此,在刷新过程中只选择了分区 P3 而非整个表,确认 PCT 能否在表即使没有 MV 日志的情况下工作。
即使在基表没有 MV 日志的情况下也可以快速刷新 MV 的能力是一个强大而有用的特性,从而允许您可以在已分区的 MV 中执行快速刷新而不会增加性能开销。我认为,该特性是 Oracle 数据库 10g 第 2 版中最有用的数据仓库增强功能。
推荐阅讯
- 深入WebLogic Portal UI编程
- Hibernate继承映射时错误的解决方法
- 在Oracle数据库上构建.NET应用程序
- 程序员建立商业意识之商业驱动力
- 软件外包刮起并购风 资本做大航母梦想
- 板桥里人:开放源码系统与创新
- Web2.0开始试探钱途 视频广告逐渐增多
- Spring中IoC的入门实例
- 解决select菜单边框无法设置的问题
- ADO操作数据的几个问题
阅读排行
- 1..net页面间的参数传递简单实例
- 2.VC++与Matlab混合编程之引擎操作详解
- 3.Oracle数据库数据对象分析
- 4.Eclipse3.2+Tomcat5.5.17+Oracle9配置
- 5.Oracle数据库中索引的维护
- 6.在Oracle的网络结构中解决连接问题
- 7.Oracle数据安全面面观
- 8.Oracle数据库的ORA-00257故障解决过程
- 9.Oracle数据库备份与恢复的三种方法
- 10.Oracle与SQL Server在企业应用中的比较
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
