测试mv刷新组是否可以同时刷新组内物化视图

我们知道刷新组的目的是为了解决外键关系表刷新先后的问题,从这个目的出发,说明刷新组内物化视图刷新是串行的。
我通过触发器的方式,监控了一下这个现象。 同时也说明了刷新组内,物化视图的刷新并不能并行。

--创建物化视图日志
CREATE TABLE POLICY (ID INTEGER PRIMARY KEY , PRODUCT_NAME VARCHAR2(200));
CREATE TABLE AGENT (agent_code VARCHAR2(30) PRIMARY KEY , NAME VARCHAR2(200));

CREATE MATERIALIZED VIEW LOG ON policy WITH PRIMARY KEY;
CREATE MATERIALIZED VIEW LOG ON AGENT WITH PRIMARY KEY; 

--创建测试mv
CREATE MATERIALIZED VIEW mv_policy
REFRESH FAST ON DEMAND
 NEXT NULL
AS
select * from policy ; 

CREATE MATERIALIZED VIEW mv_agent
REFRESH FAST ON DEMAND
 NEXT NULL
AS
select * from AGENT; 

SELECT * FROM user_jobs; 

--查看物化视图默认在哪个刷新组
select * from user_refresh_children where NAME = ‘MV_POLICY‘;
select * from user_refresh_children where NAME = ‘MV_AGENT‘; 

SQL> select NAME,RNAME from user_refresh_children where NAME = ‘MV_POLICY‘;
NAME                                                         RNAME
------------------------------------------------------------ ------------------------------------------------------------
MV_POLICY                                                    MV_POLICY

SQL> select NAME,RNAME from user_refresh_children where NAME = ‘MV_AGENT‘; 

NAME                                                         RNAME
------------------------------------------------------------ ------------------------------------------------------------
MV_AGENT                                                     MV_AGENT

--查看有几个刷新组
SQL> select ROWNER, RNAME, REFGROUP from user_refresh;

ROWNER                                                       RNAME                                                          REFGROUP
------------------------------------------------------------ ------------------------------------------------------------ ----------
SCOTT                                                        MV_EMP                                                                1
SCOTT                                                        MV_POLICY                                                             2
SCOTT                                                        MV_AGENT                                                              3

--mv从刷新组里去掉之后,如果刷新组没有mv,则刷新组也消失了。
BEGIN
  dbms_refresh.subtract(name => ‘MV_POLICY‘,list => ‘MV_POLICY‘);
  commit;
END;
BEGIN
  dbms_refresh.subtract(name => ‘MV_AGENT‘,list => ‘MV_AGENT‘);
  commit;
END;

再看看,就只剩下mv_emp了 ,这个物化视图不是这次测试要用到的。
SQL> select ROWNER, RNAME, REFGROUP from user_refresh;

ROWNER                                                       RNAME                                                          REFGROUP
------------------------------------------------------------ ------------------------------------------------------------ ----------
SCOTT                                                        MV_EMP                                                                1

--创建刷新组,创建刷新组时可以不指定组内的MV,但是next_date和 interval 需要指定,可以为空。
BEGIN
  dbms_refresh.make(name => ‘refgroup01‘,list => ‘‘,next_date => NULL,interval =>  NULL);
  commit;
END;

SQL> select ROWNER, RNAME, REFGROUP from user_refresh;

ROWNER                                                       RNAME                                                          REFGROUP
------------------------------------------------------------ ------------------------------------------------------------ ----------
SCOTT                                                        MV_EMP                                                                1
SCOTT                                                        REFGROUP01                                                            4

--给刷新组增加MV
BEGIN
  dbms_refresh.add(name => ‘REFGROUP01‘,list => ‘mv_policy,mv_agent‘);
  commit;
END;

SQL> select NAME,RNAME from user_refresh_children where rname=‘REFGROUP01‘;

NAME                                                         RNAME
------------------------------------------------------------ ------------------------------------------------------------
MV_POLICY                                                    REFGROUP01
MV_AGENT                                                     REFGROUP01

--创建触发器监控表 

create table BUSINESS_LOG_2
(
  datecode       DATE not null,
  tablename      VARCHAR2(40) not null,
  businessfield1 VARCHAR2(20) not null,
  field1_content VARCHAR2(300) not null,
  businessfield2 VARCHAR2(20),
  field2_content VARCHAR2(600),
  businessfield3 VARCHAR2(20),
  field3_content VARCHAR2(300),
  businessfield4 VARCHAR2(20),
  field4_content VARCHAR2(300),
  businessfield5 VARCHAR2(20),
  field5_content VARCHAR2(300),
  businessfield6 VARCHAR2(20),
  field6_content VARCHAR2(300),
  businessfield7 VARCHAR2(20),
  field7_content VARCHAR2(600),
  businessfield8 VARCHAR2(20),
  field8_content VARCHAR2(300),
  businesstype   VARCHAR2(10) not null,
  sourceflag     CHAR(1),
  remark         VARCHAR2(20),
  businessfield9 VARCHAR2(20),
  field9_content VARCHAR2(300)
);

CREATE OR REPLACE TRIGGER tri_mv_policy
  before update or insert on mv_policy  for each row
begin

  --update操作记录
  insert into Business_Log_2
    (BusinessType,
     DateCode,
     TableName,
     BusinessField1,
     Field1_Content,
     SourceFlag,
     Remark)
  values
    (‘OLD‘,
     sysdate,
     ‘MV_POLICY‘,
     ‘ID‘,
     nvl(:OLD.ID, 1),
     ‘1‘,
     NULL);

  --insert操作记录
  insert into Business_Log_2
    (BusinessType,
     DateCode,
     TableName,
     BusinessField1,
     Field1_Content,
     SourceFlag,
     Remark)
  values
    (‘NEW‘,
     sysdate,
     ‘MV_POLICY‘,
     ‘ID‘,
     nvl(:new.ID, 1),
     ‘1‘,
     NULL);
end;
/

CREATE OR REPLACE TRIGGER tri_mv_agent
  before update or insert on mv_agent  for each row
begin

  --update操作记录
  insert into Business_Log_2
    (BusinessType,
     DateCode,
     TableName,
     BusinessField1,
     Field1_Content,
     SourceFlag,
     Remark)
  values
    (‘OLD‘,
     sysdate,
     ‘MV_AGENT‘,
     ‘AGENT_CODE‘,
     nvl(:OLD.AGENT_CODE, 1),
     ‘1‘,
     NULL);

  --insert操作记录
  insert into Business_Log_2
    (BusinessType,
     DateCode,
     TableName,
     BusinessField1,
     Field1_Content,
     SourceFlag,
     Remark)
  values
    (‘NEW‘,
     sysdate,
     ‘MV_AGENT‘,
     ‘AGENT_CODE‘,
     nvl(:new.AGENT_CODE, 1),
     ‘1‘,
     NULL);
end;
/

---原表更新数据
--生成mvlog
INSERT INTO policy (id, product_name)
SELECT level, ora_hash(LEVEL) FROM dual CONNECT BY LEVEL <= 99999;

COMMIT; 

INSERT INTO AGENT (agent_code, name)
SELECT level, ora_hash(LEVEL) FROM dual CONNECT BY LEVEL <= 88888;
COMMIT;  

--启动刷新组

BEGIN
  dbms_refresh.refresh(name => ‘REFGROUP01‘);
  commit;
END;

SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";

Session altered.

SQL> select TABLENAME,MIN(datecode),MAX(datecode) from business_log_2 group by TABLENAME ; 

TABLENAME                                                                        MIN(DATECODE)       MAX(DATECODE)
-------------------------------------------------------------------------------- ------------------- -------------------
MV_AGENT                                                                         2020-04-09 23:35:46 2020-04-09 23:36:00
MV_POLICY                                                                        2020-04-09 23:36:00 2020-04-09 23:36:15

  

这个触发器记录的时间就有意思了, 说明是mv_agent先刷新的,然后才刷新mv_policy

原文地址:https://www.cnblogs.com/fooobabar/p/12670581.html

时间: 2024-08-27 20:07:39

测试mv刷新组是否可以同时刷新组内物化视图的相关文章

物化视图刷新慢--有可能是mv log被多个mv使用造成的

同事说物化视图刷新慢,经检生产环境,发现部分物化视图刷新慢的原因是:由于同一个物化视图日志(mv log)被多个物化视图(mv)使用,不同的物化视图(mv)使用不同的刷新间隔,导致物化视图日志(mv log)中记录过多而使得快速刷新变得缓慢. 具体查找过程如下:1.首先查询物化视图日志表select * from user_table t where t.table_name like 'MLOG%'这些MLOG$开头的表都是物化视图的日志表,换句话说这些基表每次发生改变的信息就记录在这个日志表

物化视图的刷新(转载)

转载源自于:http://czmmiao.iteye.com/blog/1827254 物化视图 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照.物化视图可以基于表查询,视图和其它的物化视图.通常情况下,在复制环境下,物化视图被称为主表,在数据仓库中称为明细表.对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的.如果你想修改本地副本,必须用高级复制的功能.当你想从一个表或视图中抽取

Oracle数据库入门——如何根据物化视图日志快速刷新物化视图

Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构:SQL> create table t(id number, name varchar2(30), num number);表已创建. SQL> create materialized view log on t with rowid, sequence(id, name) including new v

postgresql9.5 物化视图测试

视图是指数据库只存储定义该视图的查询语句(内容是查询时产生),而物化视图是一个其查询语句查询后的内容并存储的视图(内容是创建物化视图刷新视图时产生,数据可修改.独立).因为物化视图是视图的一个物化表结构,但是里面的数据是创建时刷新查询到额数据,当原数据更新修改时如果物化视图的表没有更新会造成数据的不一致.从9.4开始增加增量刷新,9.5的版本中支持物化视图也支持索引,修改表空间,指定用户访问权限 postgresql9.5物化视图测试: search package: sudo apt-cach

[转]物化视图创建 及 刷新机制修改

物化视图对于前台数据库使用者来说如同一个实际的表,具有和一般表相同的如select等操作,而其实际上是一个视图,一个由系统实现定期刷新其数据的视图(具体刷新时间在定义物化视图的时候已有定义),使用物化视图更可以实现视图的所有功能,而物化视图却不是在使用时才读取,大大提高了读取速度,特别适用抽取大数据量表某些信息以及数据链连接表使用,但是物化视图占用数据库磁盘空间.具体语法如下: 一.物化视图的创建 create materialized view [view_name] refresh [fas

解决oracle 物化视图刷新失败

oracle 物化视图刷新失败可能原因: 1.视图未建立物化视图日志 2.基表为授权给用户 1.物化视图语法 create materialized view [view_name] refresh [fast|complete|force] [ on [commit|demand] | start with (start_time) next (next_time) ] as {创建物化视图用的查询语句} 以上是Oracle创建物化视图(Materialized View,以下简称MV)时的常

PostgreSQL定时刷新物化视图的一种简单方法

PostgreSQL 9.3开始支持物化视图,9.4又增加了非阻塞的CONCURRENTLY选项,但REFRESH时却不支持类似START WITH ... NEXT ...的定时刷新选项. 如何实现定时刷新物化视图?百度的结果主要是以下三种: 借助操作系统,如Linux/Unix的crontab或Windows的定时任务: 借助插件pgAgent: 使用触发器,一般为语句级(... FOR EACH STATEMENT ...). 近日接触到\watch命令,发现了一种新的刷新物化视图的方法.

Adnroid 两种下拉刷新 方式的实现 sina刷新 gmail刷新

sina刷新 这种下拉刷新的方式是比较简单的.上个图: 这种刷新方式的思路是这样的: 首先是需要一个HeaderVIew也就是刷新时头部所显示出来的数据.这个view的布局随你,长啥样自己定夺. 其他不是特别重要,重要的是用户触摸事件的捕捉,看到github上的大神的一些方法是比较正规的,我就自己用自己的方法尝试,主要是捕捉到用户的点击事件来计算用户所触摸到的位置然后来更新头部布局的位置. 这个重要的代码贴出来: case MotionEvent.ACTION_MOVE: currentY =

安卓自带下拉刷新SwipeRefreshLayout添加上拉刷新功能

在项目里面要用到刷新库,以前都是使用第三方的,不过看到官方出了  SwipeRefreshLayout之后就用SwipeRefreshLayout,但是不知道什么原因官方SwipeRefreshLayout只提供下拉刷新功能,很多时候我们需要上拉刷新功能,所以下载v4源码修改SwipeRefreshLayout,与之相关联的文件有两个分别是SwipeProgressBar,BakedBezierInterpolator把这三个文件拷贝到项目里面,修改一下包名就可以了.如何实现上拉刷新功能,其