物化视图得基本概念:
oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,
这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。
物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,
增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;
物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。
物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。
三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。
建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。
BUILD IMMEDIATE是在创建物化视图的时候就生成数据,
而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。
查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。
分别指出创建的物化视图是否支持查询重写。
查询重写是指当对物化视图的基表进行查询时,
Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,
而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。
刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,
可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。
ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。
刷新的方法有四种:FAST、COMPLETE、FORCE和NEVE*。
**ST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。
COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,
则Oracle在刷新时会去判断是否可以进行快速刷新,
如果可以则采用FAST方式,否则采用COMPLETE的方式。
NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。
在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。
不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。
物化视图日志:如果需要进行快速刷新,则需要建立物化视图日志。
物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。
还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。
这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。
这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。
物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。
具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。
对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。
SQL> set autotrace traceonly;
SQL> select owner,count(*) from my_objects
2 group by owner
3 order by count(*) desc ;
24 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=329 Card=24 Bytes=12
0)
1 0 SORT (ORDER BY) (Cost=329 Card=24 Bytes=120)
2 1 SORT (GROUP BY) (Cost=329 Card=24 Bytes=120)
3 2 TABLE ACCESS (FULL) OF 'MY_OBJECTS' (Cost=122 Card=926
76 Bytes=463380)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2517 consistent gets 2517个逻辑读
0 physical reads
0 redo size
1129 bytes sent via SQL*Net to client
666 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
24 rows processed
创建物化视图:
create materialized view my_objects_agg build immediate refresh on commit enable query rewrite
as
select owner,count(*) from my_objects
group by owner
order by count(*) desc
分析物化视图
analyze table my_objects_agg compute statistics
QL> show parameter que
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
enqueue_resources integer 968
job_queue_processes integer 0
query_rewrite_enabled string FALSE ---需要修改成true
query_rewrite_integrity string enforced
SQL> alter session set query_rewrite_enabled=TRUE;
Session altered.
SQL>
SQL> set autotrace traceonly;
SQL> select owner,count(*) from my_objects
2 group by owner
order by count(*) desc 3 ;
24 rows selected.
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=24 Bytes=192)
1 0 SORT (ORDER BY) (Cost=5 Card=24 Bytes=192)
2 1 TABLE ACCESS (FULL) OF 'MY_OBJECTS_AGG' (Cost=2 Card=24
Bytes=192)
Statistics
----------------------------------------------------------
11 recursive calls
0 db block gets
14 consistent gets
0 physical reads
0 redo size
1129 bytes sent via SQL*Net to client
666 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
24 rows processe
插入数据,看看是不是物化视图的数据量跟随着变化?
sql>insert into my_objects select * from dba_objects;
sql> commit ;
物化视图的数据量跟随的变化
sql>select * from MY_OBJECTS_AGG 数据量跟着变化..
加入条件,看系统的执行计划
SQL> select owner,count(*) from my_objects where owner='SYS'
2 group by owner
3 order by count(*) desc ;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=1 Bytes=8)
1 0 SORT (ORDER BY) (Cost=5 Card=1 Bytes=8)
2 1 TABLE ACCESS (FULL) OF 'MY_OBJECTS_AGG' (Cost=2 Card=1 B
ytes=8
Statistics
----------------------------------------------------------
14 recursive calls
0 db block gets
6 consistent gets
0 physical reads
0 redo size
558 bytes sent via SQL*Net to client
655 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
物化视图主要用于决策支持系统,数据仓库,一般不用于高并发的 oltp 系统.
如果执行计划没有使用物化视图:可以使用 hit
select /*+ rewrite(user_order_2008_wrj_mavi) */count(u.user_isdn) as cnt ,i.area_code,u.service_id
from user_order_2008_wrj u,isdn_head i
where substr(u.user_isdn,1,7) = i.isdn_head
and u.bill_type = 3 and u.follow_action = 1
group by i.area_code ,u.service_id
order by i.area_code
物化视图得删除:
如果物化视图是 on commit 首先改成 on demand ,然后再 drop
ALTER MATERIALIZED VIEW user_order_mavi refresh on demand;
drop MATERIALIZED VIEW user_order_mavi;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/66233/viewspace-998255/ ,如需转载,请注明出处,否则将追究法律责任。