快速刷新多表连接聚集物化视图
June 22nd, 2007 | Categories: Boring | Tags:
Leave a comment | Trackback
仅以此文感谢YangTingKun同学:)
有物化视图的问题都找他。
起因是夺表连接的聚集SQL无法继续优化,反应时间几秒左右,buffer gets&cpu成本等还很高;加上还需要频繁执行。好在是,相关的表不是经常更新,只是查询频繁。正好适合物化视图。
select count(*)
from mos m, attributes a, mo_attributes ma, classes cl
where m.mo_class_id = cl.mo_class_id
and m.mo_id = ma.mo_id
and ma.attribute_id = a.attribute_id
and cl.class_name = ?;
准备使用如下SQL创建物化视图,
create Materialized view XXXXXX
enable query rewrite
as
select cl.class_name,count(*)
from mos m, attributes a,
mo_attributes ma, classes cl
where m.mo_class_id = cl.mo_class_id
and m.mo_id = ma.mo_id
and ma.attribute_id = a.attribute_id
group by cl.class_name;
则关键的实现就在于如何刷新了;咨询了yangtingkun,Oracle竟然能够对这种,多表连接,还又聚集的表作on commit fast refresh,太智能了。
大猫 说:
由于这些表更新不是很多,想要在commit的时候,作fast refresh on commit
大猫 说:
不知道因为这个group by 的存在能否实现?
大猫 说:
问题完毕。
yangtingkun 说:
包含聚集的物化视图:
1.必须满足所有快速刷新物化视图都满足的条件;
2.物化视图查询的所有表必须建立物化视图日志,且物化视图日志必须满足下列限制:
(1)包含物化视图查询语句中的所有列,包括SELECT列表中的列和WHERE语句中的列;
(2)必须指明ROWID和INCLUDING NEW VALUES;
(3)如果对基本的操作同时包括INSERT、UPDATE和DELETE操作(即不是只包含INSERT操作),那么物化视图日志应该包括SEQUENCE。
3.允许的聚集函数包括:SUM、COUNT、AVG、STDDEV、VARIANCE、MIN和MAX;
4.必须指定COUNT ;
7.SELECT列表中必须包括所有的GROUP BY列;
yangtingkun 说:
你这个快速刷新应该不成问题,只要正确的设置物化视图日值,并正确的建立物化视图就可以了。
详细步骤如下,
创建MATERIALIZED VIEW LOG 和MATERIALIZED VIEW,需要制定一些关键字; rowid ,SEQUENCE都是为了能够on commit fast refresh而指定的
CREATE MATERIALIZED VIEW LOG on mos WITH rowid ,SEQUENCE (mo_id,mo_class_id) INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG on attributes WITH rowid,SEQUENCE (attribute_id) INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG on CLASSES WITH rowid ,SEQUENCE (mo_class_id,class_name) INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG on mo_attributes WITH rowid ,SEQUENCE (attribute_id) INCLUDING NEW VALUE;
create Materialized view binzhang
REFRESH FAST ON COMMIT
enable query rewrite
as
select cl.class_name,count(*)
from mos m, attributes a,
mo_attributes ma, classes cl
where m.mo_class_id = cl.mo_class_id
and m.mo_id = ma.mo_id
and ma.attribute_id = a.attribute_id
group by cl.class_name;
然后看query rewrite能否使用到这个物化视图,
SQL> show parameters query_rewrite
NAME TYPE VALUE
———————————— ———– ——————————
query_rewrite_enabled string TRUE
query_rewrite_integrity string enforced
select /*+ all_rows */count(*)
from mos m, attributes a, mo_attributes ma, classes cl
where m.mo_class_id = cl.mo_class_id
and m.mo_id = ma.mo_id
and ma.attribute_id = a.attribute_id
and cl.class_name = ‘XXXX’;
COUNT(1)
———-
233942
Execution Plan
———————————————————-
0 SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=2 Card=1 Bytes=35)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF ‘BINZHANG’ (Cost=2 Card=20 Bytes=700)
CBO模式下,query_rewrite_enabled=TRUE,发生了sql rewrite,自动选择了刚创建的物化视图,性能和反应时间大幅度提高。
再测试能否在发生了DML的时候做fast refresh on commit
/*+先测试删除delete*/
SQL> select * from binzhang;
……………………..
41 rows selected.
SQL> delete from classes where rownum=1;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select count(*) from binzhang;
COUNT(*)
———-
40
/*+delete work!*/
/*+再测试更新update*/
SQL> select * from binzhang;
CLASS_NAME COUNT(*)
—————————————- ———-
ODB::Action 54
SQL> update classes set CLASS_NAME=’xxxxxxxxxx’ WHERE CLASS_NAME=’ODB::Action’;
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> select * from binzhang;
CLASS_NAME COUNT(*)
—————————————- ———-
xxxxxxxxxx 54
/*+update work!*/
再次感谢YangTingKun同学:)
大猫 说:
你到时候来上海参加oracle world吗?
大猫 说:
来的话我请客吃皮萨饼
yangtingkun 说:
估计去不了,那个时候正好比较忙
大猫 说:
那我省了
大猫 说:
oracle的物化视图振强,连多表连接的fast refresh都可以做
yangtingkun 说:
限制还是比较多的,如果你这里面有OR的话,就没戏了
分享到:
相关推荐
快速刷新是物化视图刷新方式的首选,但不是所有的物化视图都可以进行快速刷新。只有满足某些条件的物化视图才具有快速刷新的能力。根据查询的不同,快速刷新的限制条件也不相同。所有类型的快速刷新物化视图都必须...
快速刷新采用增量刷新机制,基于日志挖掘原理,所有的刷新动作都是通过基表的物化视图日志来实现。快速刷新可分为自动刷新及手动刷新。自动刷新可以事先定义刷新时间、刷新间隔等参数,系统会根据要求定时刷新。手动...
物化视图刷新机制是指对物化视图中的数据进行更新的机制。PostgreSQL 提供了两种刷新方式:REFRESH MATERIALIZED VIEW table_name 和 REFRESH MATERIALIZED VIEW CONCURRENTLY table_name。前者会锁住对该物化视图的...
这样,通过比较不同物化视图的刷新时间,可以确定哪些日志记录适用于某个特定的物化视图刷新。 2. **判断哪些记录适用于当前物化视图**:当需要刷新某物化视图时,Oracle会检查该物化视图的刷新时间,并通过SNAP...
- `REFRESH` 选项定义了刷新策略,如 `FORCE` 在每次查询时强制刷新,`FAST` 利用物化视图日志进行快速刷新,`COMPLETE` 是完全刷新,`NEVER` 表示不自动刷新。 - `ON COMMIT` 或 `ON DEMAND` 定义了刷新时机,`ON ...
为了应对这一挑战,Oracle 9i 引入了物化视图的概念,这是一种用于快速访问和报告数据的有效手段。 #### 引言 物化视图最早在 Oracle 8i 中引入,并且作为 Summary Management 组件的一部分。许多组织可能已经在...
输出的脚本可能包括创建物化视图日志(Materialized View Log)的命令,物化视图日志是快速刷新机制的关键组成部分,它们记录源表的变化,以便物化视图能够追踪和更新。 总之,Oracle数据库中的物化视图是一种强大...
Oracle物化视图是一种在数据库中预先计算并存储视图查询结果的数据对象,它与普通的视图不同,普通视图在查询时动态地基于基表数据生成结果,而物化视图则拥有自己的物理存储,提供了对数据的快速访问。在本篇循序渐...
每种物化视图都有其快速刷新的限制条件,但其他方面则区别不大。 在学习 Oracle 物化视图时,需要了解物化视图的概念、创建和删除物化视图、设置自动刷新时间和日志等知识点。同时,也需要了解物化视图的优点和缺点...
物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建物化视图创建
物化视图对于大数据分析、报表生成和OLAP(在线分析处理)场景特别有用,因为它允许用户快速获取预计算的结果,而无需每次都执行复杂的查询。然而,物化视图也会占用额外的存储空间,并且需要维护与基表数据的一致性...
ON DEMAND模式意味着物化视图只在需要时(如用户手动触发或定时任务)进行刷新,以保持与基表数据的一致性。而ON COMMIT模式则更积极,一旦基表中的事务提交,物化视图就会立即刷新,确保数据即时更新。 创建一个ON...
- **自动刷新**:Oracle会定期自动刷新物化视图,可以通过调度程序(如`DBMS_SCHEDULER`)来控制刷新频率。 #### 五、物化视图的存储和管理 1. **存储属性**:物化视图作为一种特殊的表,具有自己的物理存储属性,...
总结起来,物化视图的两种实现方式各有优势,直接设计简单明了,适合快速初始化和即时刷新;定时任务触发存储过程则更适合需要定期更新且对性能有一定要求的场景。选择哪种实现方式,应根据具体的应用环境和业务需求...
2. 主键物化视图允许识别物化视图的主表,不影响物化视图的增量刷新可用性。 Rowid 子句: 1. 生成 Rowid 物化视图,基于 Rowid 的物化视图。 2. Rowid 物化视图只有一个单一的主表,不能包括 Distinct 或者聚合...
- **刷新物化视图**:定期或按需刷新物化视图以保持数据的最新状态。 - **查询物化视图**:通过简单的SELECT语句直接查询物化视图。 - **维护物化视图**:包括监控物化视图的状态、执行维护任务等。 #### 四、物化...
4. **其他配置问题**:如表空间设置、物化视图的刷新策略等也可能导致此错误。 #### 解决方案 针对上述原因,我们可以采取以下措施来解决ORA-12014错误: 1. **检查基表结构**: - 确认基表是否定义了主键或唯一...
主键物化视图允许在不影响增量刷新的前提下,通过主键快速定位主表中的记录。 #### 六、小结 通过上述介绍,我们可以看出物化视图是Oracle数据库中一种非常实用的工具,它能够显著提高复杂查询的性能,并简化数据...
物化视图日志对于快速刷新至关重要,它可以是ROWID或PRIMARY KEY类型,可以包含SEQUENCE,选择INCLUDING NEW VALUES,或者指定列的列表。`ON PREBUILD TABLE`选项允许在已存在的表上创建物化视图,但删除物化视图...