ITPub博客

首页 > 数据库 > Oracle > 物化视图

物化视图

原创 Oracle 作者:weiranjie 时间:2008-01-23 13:34:57 4 删除 编辑
物化视图得概念
物化视图得创建
物化视图得执行
物化视图得删除[@more@]

物化视图得基本概念:

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-02-24

  • 博文量
    70
  • 访问量
    246752