如何提高物化视图查询效率效率

如何查看Oracle物化视图(MVIEW)的刷新起始时间和结束时间
DBA_MVIEWS的LAST_REFRESH_DATE字段或者DBA_MVIEW_REFRESH_TIMES的LAST_REFRESH字段记录了Oracle物化视图刷新的起始时间。但如果我们想查看物化视图的刷新到底花费了多长时间,应该怎么做呢。其实,我们可以查询DBA_MVIEW_ANALYSIS。
对于完全刷新(Complete),刷新耗时会记录在DBA_MVIEW_ANALYSIS的FULLREFRESHTIM列中。而对于可快速刷新(Fast)的时间,会记录在INCREFRESHTIM列中。
这两个值的单位都是秒。
SELECT mview_name, last_refresh_date, fullrefreshtim, increfreshtim
FROM dba_mview_analysis
WHERE owner='JOHN';
MVIEW_NAME
LAST_REFRESH_DATE
FULLREFRESHTIM INCREFRESHTIM
------------------------ ---------------------- -------------- -------------
MV_CHANGE_HISTORY
07-JAN-13 04.36.58 PM
MV_ITEM_HISTORY
07-JAN-13 04.36.58 PM
上例表明MV_CHANGE_HISTORY与MV_ITEM_HISTORY最近的刷新为快速刷新,分别耗时36秒和9秒。
把它们放在一个查询里计算和显示终止时间。
mview_name,
last_refresh_date "START_TIME",
WHEN fullrefreshtim && 0 THEN
LAST_REFRESH_DATE + fullrefreshtim/60/60/24
WHEN increfreshtim && 0 THEN
LAST_REFRESH_DATE + increfreshtim/60/60/24
LAST_REFRESH_DATE
END "END_TIME",
fullrefreshtim,
increfreshtim
FROM all_mview_analysis
WHERE owner='JOHN';
MVIEW_NAME
START_TIME
FULLREFRESHTIM INCREFRESHTIM
------------------- ---------------------- ---------------------- -------------- -------------
MV_CHANGE_HISTORY
07-JAN-13 04.36.58 PM
07-JAN-13 04.37.34 PM
MV_ITEM_HISTORY
07-JAN-13 04.36.58 PM
07-JAN-13 04.37.07 PM
Reference: How To Calculate MVIEW Refresh Duration? What Does DBA_MVIEWS.LAST_REFRESH_DATE and DBA_MVIEW_REFRESH_TIMES.LAST_REFRESH Indicate? [ID ]
原文链接:
本文链接:请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。
如果您喜欢这篇博文,欢迎您捐赠书影博客:
没有类似日志
欢迎来到的博客
十一月 2014
周一周二周三周四周五周六周日物化视图(material view)是什么?
物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。(这个是基于本地的基表或者视图的聚合)。
物化视图,说白了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。当然要打开查询重写选项;
Material View的主要作用
1. 实现两个数据库之间的数据同步,可以存在时间差。
2. 如果是远程链接数据库的场景时,提高查询速度。
(由于查询逻辑复杂,数据量比较大,导致每次查询视图的时候,查询速度慢,效率低下)
物化视图的刷新方式和方法
1. 刷新的方式
2. 刷新的方法
DBMS_REFRESH.Refresh
DBMS_MVIEW.Refresh
EXEC DBMS_MVIEW.refresh('BXJ_OBJECTS_MV_T1','C');
EXEC DBMS_REFRESH.refresh('REP_MVIEWGROUP');物化视图的刷新方式和方法&(1).在源数据库建立mview log日志文件
&&&&&&&&create materialized view log on w_1 ;
----注:(TEST为表名或者视图名,关于视图上建立物化视图,见基于视图的物化视图
----创建物化视图语句:
&&&&(2).在统计数据建立materializad view& 语法 &&&
Create materialized view MV_TEST
----MVTEST为物化视图名
Build immediate
----创建时生成数据对应的是build deferred
Refresh fast
----增量刷新
----在基表有更新时提交,这里该句对视图无效
With rowid
----这里创建基于rowid的物化视图,对应的是 primary key
Select * from TEST;
----生成物化视图数据语句
    CREATE MATERIALIZED VIEW MV_TableName
BUILD IMMEDIATE
--创建时立即刷新
REFRESH FORCE
--如果可以快速刷新则进行快速刷新,否则完全刷新
--刷新方式
START WITH SYSDATE
--第一次刷新时间
SYSDATE+1/12
--刷新时间间隔
AS SELECT 1 id &A& name FROM
&&& (3).调用时进行刷新
&&&&&&&&dbms_refresh.refresh('W_1')
创建物化视图CREATE MATERIALIZED VIEW bxj_objects_mv_t1 REFRESH FAST AS SELECT * FROM apps.bxj_objects_t1;
CREATE MATERIALIZED VIEW bxj_objects_mv_t2 REFRESH FORCE AS SELECT * FROM bxj_objects_t2;
CREATE MATERIALIZED VIEW bxj_objects_mv_t3 REFRESH COMPLETE AS SELECT * FROM bxj_objects_t3;ON DEMAND和ON COMMIT物化视图的区别
ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,
ON DEMAND顾名思义,仅在该物化视图&需要&被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;
而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。物化视图是物理表的么?1) 物化视图在某种意义上说就是一个物理表(但并不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证;
2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;
3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证。
查询物化视图上次刷新时间
SELECT last_refresh_date
FROM user_mviews
WHERE mview_name = 'MV_TABLENAME';
阅读(...) 评论()ORACLE中的物化(实体)视图
&物化视图是包括一个查询结果的数据库对像,它是远程数据的的
本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基
于远程表的数据,也可以称为快照。
&物化视图可以查询表,视图和其它的物化视图。
&通常情况下,物化视图被称为主表(在复制期间)或明细表(在
数据仓库中)。
&对于复制,物化视图允许你在本地维护远程数据的副本,这些副本
是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想
从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
&对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表
聚合视图和连接视图。
本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。
&在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询
1.主键物化视图:
&下面的语法在远程数据库表emp上创建主键物化视图
CREATE MATERIALIZED VIEW mv_emp_pk
FAST START WITH SYSDATE
SYSDATE + 1/48
PRIMARY KEY
&AS SELECT
* FROM emp@remote_
&Materialized view
&注意:当用FAST选项创建物化视图,必须创建基于主表的视
图日志,如下:
CREATE MATERIALIZED VIEW LOG ON
&Materialized view log
2.Rowid物化视图
&下面的语法在远程数据库表emp上创建Rowid物化视图
CREATE MATERIALIZED VIEW mv_emp_rowid
WITH ROWID
&AS SELECT
* FROM emp@remote_
&Materialized view log
3.子查询物化视图
&下面的语法在远程数据库表emp上创建基于emp和dept表的
子查询物化视图
CREATE MATERIALIZED VIEW mv_empdept
&AS SELECT
* FROM emp@remote_db e
&(SELECT *
FROM dept@remote_db d
e.dept_no = d.dept_no)
&Materialized view log
[fast|complete|force]
&[on demand
with date] [next date]
{primary key|rowid}]]
&Refresh选项说明:
oracle用刷新方法在物化视图中刷新数据.
是基于主键还是基于rowid的物化视图
物化视图的刷新时间和间隔刷新时间
Refresh方法-FAST子句
&增量刷新用物化视图日志(参照上面所述)来发送主表已经修改
的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对
主表创建物化视图日志
CREATE MATERIALIZED VIEW LOG ON
Materialized view log created.
&对于增量刷新选项,如果在子查询中存在分析函数,则物化视图
不起作用。
Refresh方法- COMPLETE子句
&完全刷新重新生成整个视图,如果请求完全刷新,oracle会完成
完全刷新即使增量刷新可用。
Refresh Method & FORCE 子句
&当指定FORCE子句,如果增量刷新可用Oracle将完成增量刷新,
否则将完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or
FORCE),Force选项是默认选项
主键和ROWD子句
PRIMARY KEY选项生成主键物化视图,也就是说物化视图
是基于主表的主键,而不是ROWID(对应于ROWID子句). PRIMARY
KEY是默认选项,为了生成PRIMARY KEY子句,应该在主表上定义
主键,否则应该用基于ROWID的物化视图.
&主键物化视图允许识别物化视图主表而不影响物化视图增量刷新
的可用性。
&Rowid物化视图只有一个单一的主表,不能包括下面任何一项:
 或者聚合函数.
by ,子查询,连接和SET操作
WITH子句通知数据库完成从主表到本地表第一次复制的
时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的
CREATE MATERIALIZED VIEW mv_emp_pk
&START WITH
SYSDATE + 2
PRIMARY KEY
&AS SELECT
* FROM emp@remote_
&Materialized view
在上面的例子中,物化视图数据的第一个副本在创建时生成,以后每
两天刷新一次.
物化视图提供了可伸缩的基于主键或ROWID的视图,指定了刷新方
法和自动刷新的时间。
物化视图的效率
有两个表:人员表A001有10万数据,机构表B001有5千数据
建普通视图:
or replace view test_v as
* from A001 a ,B001 B where a.a001721=b.orguid
建一个物化视图
MATERIALIZED view test_v_m as
* from A001 a ,B001 B where a.a001721=b.orguid
比较效率:
* from test_v where A001001 like '%军%' or
b001003 like '1006%' or A001011 like '70%' ;用
test_v_m where A001001 like '%军%' or b001003 like
'1006%' or A001011 like '70%' ;用时0.125秒
对查询来说,物化视图的效率是普通视图的10/0.125=80倍;相
创建多表关联的实体化视图
某些实体化视图包含多表关联,但不包含聚合操作
(例如sum())
Example 8-4
实体化视图是在 sales 表和times,customers 三张表的关联的基础上
创建的。创建这种类型的实体化视图的好处是预先处理了代价高昂
的关联操作。在任意类型的 DML操作之后,使用fast refresh 的方
式来刷新仅包含表关联的实体化视图是可以实现的。
仅包含表关联的实体化视图同样支持在两种情况下刷新:
&ON COMMIT
和 ON DEMAND.在 ON COMMIT 下,当基表发生
DML操作并提交commit 的时候,实体化视图被刷新。
Oracle不允许实体化视图中有self-jions 的存在。
假如指定刷新方式为
REFRESH FAST, oracle 执行附加的校验,以确定fast refresh能被执
行。这些附加的检查包括:
每个基表下必须创建相应的 materialized view log
每个基表的rowid 必须在实体化视图的select 语句中出现
3如果存在外联接,在where 子句不能有任何的selections.并且,所
有的关联必须以 AND 相连,并且用 “=”操作符。
4如果存在外联接,唯一性约束必须存在于外联的 inner table 的相关
为了提高刷新的速度,必须在实体化视图上创建基表的 rowed 所在
列的索引。
Example 8-4 Materialized View Containing Only Joins
MATERIALIZED VIEW LOG ON sales
MATERIALIZED VIEW LOG ON times
MATERIALIZED VIEW LOG ON customers
MATERIALIZED VIEW detail_sales_mv
PARALLEL BUILD IMMEDIATE
REFRESH FAST
s.rowid "sales_rid", t.rowid "times_rid", c.rowid
"customers_rid",
c.cust_id, c.cust_last_name, s.amount_sold,
s.quantity_sold, s.time_id
sales s, times t, customers c
s.cust_id = c.cust_id(+) AND s.time_id = t.time_id(+);
在这个示例中,为了执行
唯一性约束必须存在于
c.cust_id and t.time_id.
sales_rid, times_rid, and customers_rid
各自的索引,如此可以提高刷新的速度。
INDEX mv_ix_salesrid ON detail_sales_mv("sales_rid");
Materialized Views with Aggregates
创建聚合类型的实体化视图。
在数据仓库中,实体化视图中经常会包括一些聚合操作。为了能够进
行快速刷新(fast refersh) ,在select 语句中必须包含所有在group by
中出现的列名,并且必须有一个count(*) ,所有在gorup by 中出现
的列都必须有一个 count(列名)出现在select 中。同样,所有于实体
化视图相关的表上都必须创建实体化和视图日志。有效的聚合函数包
被聚合的值可以是任何的
一个包含关联和聚合的实体化视图是可能的。但有如下限制:
实体化视图中不能包含非复用的表达式
具有实时特征的
SYSDATE and ROWNUM.
实体化视图中不能包含
LONG 数据类型。
实体化视图相关的表必须创建实体化视图日志,并且满足如下条件
包含被实体化视图引用到的所有的列。
rowed和INCLUDING NEW VALUES.
如果表的预期操作是
inserts/direct-loads, deletes, and updates的混合,指定SEQUENCE 子
对于每个聚合
&agg(expr),
必须相应写一个
&count(expr)
如果VARIANCE(expr)or STDDEV(expr)被指定,那么
COUNT(expr)and SUM(expr) 必须被指定。Oracle推荐 SUM(expr
也被指定。在
select列表中必须包含所有group by
中出现的列.如果实体化视图有如下的一点,那么fast refresh 只支持
和直接路径的装载
实体化视图包含MIN 或者 MAX
实体化视图包含SUM(expr)
&但是没有COUNT(expr)
实体化视图中不包含
&COUNT(*)如上的实体化视图称之为insert-only
materialized view.
MIN实体化视图在delete或者混合的
操作之后可以是 fast refresh,条件是视图中没有where 子句。
如果没有外联接,在where 子句中可以包含有选择性的条件和关联
&如果实体化视图中包含外联接,fast
refresh只支持在outer table 被
修改的情况。同样,唯一性约束必须存在于
join table中。如果有外联,所有的关联条件都必须用 AND 连
接和必须用
= 操作符。
Example 8-1
Example 1: Creating a Materialized View
MATERIALIZED VIEW LOG ON products WITH
SEQUENCE, ROWID
(prod_id, prod_name, prod_desc, prod_subcategory,
prod_subcategory_desc,
prod_category, prod_category_desc, prod_weight_class,
prod_unit_of_measure,
&prod_pack_size,
supplier_id, prod_status, prod_list_price,
prod_min_price)
INCLUDING NEW VALUES;
MATERIALIZED VIEW LOG ON sales
SEQUENCE, ROWID
(prod_id, cust_id, time_id, channel_id, promo_id,
quantity_sold,
amount_sold)
INCLUDING NEW VALUES;
MATERIALIZED VIEW product_sales_mv
TABLESPACE demo
STORAGE (INITIAL 8k NEXT 8k PCTINCREASE 0)
REFRESH FAST
QUERY REWRITE
SELECT p.prod_name, SUM(s.amount_sold) AS dollar_sales,
COUNT(*) AS cnt, COUNT(s.amount_sold) AS cnt_amt
sales s, products p
s.prod_id = p.prod_id GROUP BY p.prod_
Example 8-3 Example 3:
Creating a Materialized View
MATERIALIZED VIEW LOG ON sales WITH SEQUENCE,
(prod_id, cust_id, time_id, channel_id, promo_id,
quantity_sold,
amount_sold)
INCLUDING NEW VALUES;
MATERIALIZED VIEW sum_sales
REFRESH FAST ON COMMIT AS
s.prod_id, s.time_id, COUNT(*) AS count_grp,
SUM(s.amount_sold) AS sum_dollar_sales,
COUNT(s.amount_sold) AS count_dollar_sales,
SUM(s.quantity_sold) AS sum_quantity_sales,
COUNT(s.quantity_sold) AS count_quantity_sales
BY s.prod_id, s.time_
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 mysql视图效率 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信