ORACLE物化视图- 循序渐进MView(六) MView管理



MView重要视图

Oracle文档中MView相关视图的链接Materialized View and Refresh Group Views


在源数据库端的相关视图


DBA_BASE_TABLE_MVIEWS

此视图与系统视图SYS.SLOG$相对应。

视图DBA_BASE_TABLE_MVIEWS记录了使用MView Log访问基表的相关刷新的信息。换句话说就是记录了使用了MView Log并且做过快速刷新的MView的信息,必须同时满足有MView Log以及做过快速刷新这两个条件,缺一不可。

列名描述
OWNER基表的OWNER
MASTER基表的名称
MVIEW_LAST_REFRESH_TIME基于这个基表的MView最后的快速刷新的时间
MVIEW_ID基于这个基表的MView在数据库中的ID,这个可以和DBA_REGISTERED_MVIEWS关联找出相应的MView的名称
备注:SYS.SLOG$的作用
SYS.SLOG$记录了注册在源数据库端的能进行快速刷新的MView的信息。这个信息在进行快速刷新的时候会备用到,同时也会用来维护基表的MView Log信息。

 


DBA_REGISTERED_MVIEWS

此视图与系统视图SYS.REG_SNAP$相对应。

视图DBA_REGISTERED_MVIEWS记录了所有在主站点上面注册的MView的相关的信息,这里保存的东西只是起提供信息性的作用。当MView在创建的时候Oracle会自动的将MView的信息写入到此视图中,但是也不排除会有失败的情况,要是失败了的话需要手动的使用DBMS_MVIEW包中的REGISTER_MVIEW进行注册。

详细的列描述就不列了,具体的参看文档。

备注:SYS.REG_SNAP$的作用
SYS.REG_SNAP$记录了注册在源数据库端的MView的信息,这个表只是为了提供信息而用。

DBA_MVIEW_LOGS

此视图与系统视图SYS.mlog$相对应。

此视图记录了源数据库中的所有的MView Log的相关信息。

详细的列描述就不列了,具体的参看文档。


在MView数据库端的相关视图


DBA_MVIEWS

此视图与系统视图SYS.SNAP$相对应。

此视图我们在之前已经接触了很多了,视图里面保存了数据库中所有的MView的信息。我们进行的大部分物化视图的查询工作都要基于这个视图来进行。

详细的列描述见文档。


DBA_MVIEW_REFRESH_TIMES

此视图与系统视图SYS.SNAP_REFTIME$相对应。

此视图记录了MView最后刷新的时间,这在我们检查MView是否正常的刷新过时很有用的。

详细的列描述见文档。


DBA_REFRESH和DBA_REFRESH_CHILDREN

这两个视图我们在之前也已经接触过了,主要是记录了刷新组相关的信息。


MView相关包

在进行MView的维护的时候使用的最多的就是DBMS_MVIEW和DBMS_REFRESH这两个包了,前一个用来进行MView的维护,另外一个进行MView刷新组的维护。

相关的Oracle文档


一些MView维护的相关问题


SNAPSHOT vs. Materialized View

SNAPSHOT == Materialized View (老版本的Oracle中管MView叫SNAPSHOT :) )

  • DBMS_SNAPSHOT == DBMS_MVIEW
  • CREATE SNAPSHOT == CREATE MATERIALIZED VIEW


清理无效的MView Log

1. 查询MV表信息

SELECT  *  FROM   DBA_BASE_TABLE_MVIEWS ;
  • ALL_BASE_TABLE_MVIEWS: All materialized views with log(s) in the database that the user can see

2. 查询已注册的快照信息

col   owner   for   a15
col   name   for   a30
col   snapshot_site   for   a15
col   refresh_method   for   a15
select   owner ,  name ,  snapshot_site ,  refresh_method   from dba_registered_snapshots ;

3. 对比上面两个结果找出很久没有刷新的MV ID,然后进行UNREGISTER_MVIEW操作

EXEC   DBMS_MVIEW . UNREGISTER_MVIEW ( mviewowner ,  mviewname ,  mviewsite ) ;
  • mviewowner: MView的OWNER。
  • mviewname: MView的名字。
  • mviewsite: 这个可以从DBA_REGISTERED_MVIEWS中的MVIEW_SITE中看到。

4. 清理MVLOG记录

SQL >  EXEC   DBMS_MVIEW . PURGE_MVIEW_FROM_LOG ( MVID ) ;


查询MView Log的大小

set   serveroutput   on
 
declare   v_output   number ;
begin
   dbms_output . put_line ( ' Owner                MV Table Name                            MV Log Size    ' ) ;
   dbms_output . put_line ( ' -------------------- ---------------------------------------- -------------- ' ) ;
   for   c_cursor   in   ( select   owner ,  object_name   from   all_objects   where object_name   like   ' MLOG$_% ' )   LOOP
     execute   immediate   ' select count(*) from  '  ||  c_cursor . owner || ' . ' ||  c_cursor . object_name   into   v_output ;
     dbms_output . put_line (
         rpad ( substr ( c_cursor . owner , 0 , 20 ) , 20 , '   ' ) || '   '
        || rpad ( substr ( c_cursor . object_name , 7 , 40 ) , 40 ,  '   ' )
        || '   ' || v_output ) ;
   end   loop ;
end ;
/
 
set   serveroutput   off


检查MV的刷新兼容性

-- build table MV_CAPABILITIES_TABLE
SQL > @?/ rdbms / admin / utlxmv . sql
 
-- explain mv
TRUNCATE   TABLE   MV_CAPABILITIES_TABLE ;
EXECUTE   DBMS_MVIEW . EXPLAIN_MVIEW ( ' mv_t3 ' ) ;
 
-- Or like this
TRUNCATE   TABLE   MV_CAPABILITIES_TABLE ;
BEGIN
   DBMS_MVIEW . EXPLAIN_MVIEW   ( ' SELECT * FROM oe.orders@orc1.world o
  WHERE EXISTS (SELECT * FROM oe.customers@orc1.world c
    WHERE o.customer_id = c.customer_id AND c.credit_limit > 500) ' ) ;
END ;
/
 
-- 查看结果
COL   MVOWNER   FOR   A10
COL   MVNAME   FOR   A20
COL   MSGTXT   FOR   A65
SELECT   MVOWNER , MVNAME , CAPABILITY_NAME , POSSIBLE , MSGTXT   FROM MV_CAPABILITIES_TABLE ;


查询MView刷新延时

set   linesize   130
column   interval   format   999999
column   " rgroup owner "   format   a20
column   " refresh group "   format   a20
column   " minutes behind "   format   9999.99
column   " master link "   format   a20
column   " mview owner "   format   a15
column   next_date   format   a20
 
SELECT
--    int.rowner "rgroup owner",
--    int.rname "refresh group",
     mv . owner   as   " mview owner " ,
     mv . mview_name   as   " mview name " ,
     mv . master_link   as   " master link " ,
     round ( 1440 * ( sysdate  -  mv . last_refresh_date ))   as   " minutes behind " ,
     to_char ( int . next_date ,  ' yyyy-mm-dd hh24:mi:ss ' )   " next date " ,
     round ( int . interval * 1440 )   " interval "
FROM   dba_mviews   mv ,
(
     SELECT   child . owner ,  child . name ,  child . rowner ,  child . rname , job . next_date ,  job . next_date  -  job . last_date   as   interval
     FROM   dba_refresh   ref ,  dba_refresh_children   child ,  dba_jobs   job
     WHERE   ref . rname  =  child . rname   AND   (( upper ( job . what )   LIKE ' % ' || ref . rname || ' % ' )
         OR   ( upper ( job . what )   LIKE   ' % ' || ref . rname || ' % ' ))
)   int
WHERE   mv . owner  =  int . owner ( + )   AND   mv . mview_name  =  int . name ( + )
ORDER   BY   ( sysdate  -  mv . last_refresh_date )  *  1440   DESC ,  mv . owner , mv . mview_name ;


参考文档

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值