如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间

在网上已经搜索过 根本就没有相关的问题 跪求oracle大神解答

你确定你搜了么。。。
以下是物化视图的建立,注意是refresh mode是 on demand还是on commit
ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
创建物化视图时未作指定,则Oracle按ON DEMAND模式来创建。

但怎么更新?或者说物化视图的数据怎么随着基表而更新?Oracle提供了两种方式,手工刷新和自动刷新,像我们这种,在物化视图定义时,未作任何指定,那当然是默认的手工刷新了。也就是说,通过我们手工的执行某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据一致性。
所谓的自动刷新,其实也就是Oracle会建立一个job,通过这个job来调用相同的存储过程或包

CREATE MATERIALIZED VIEW mview_name
[TABLESPACE ts_name]
[PARALLEL (DEGREE n)]
[BUILD {IMMEDIATE|DEFERRED}]
[{ REFRESH {FAST|COMPLETE|FORCE}
[{ON COMMIT|ON DEMAND}]
| NEVER REFRESH } ]
[{ENABLE|DISABLE} QUERY REWRITE]
AS SELECT … FROM …
基于你说的情况,有job的定时刷新,应该是on commit的情况,或者是手动建立的job

下面给出我的测试:
create materialized view scott.MV_test_index
refresh force on commit
as
select * from scott.test_index;
SQL> select count(*) from mv_test_index;

COUNT(*)
----------
50195

SQL> delete from test_index where rownum=1;

1 row deleted.

SQL> commit;

Commit complete.

SQL> select count(*) from mv_test_index;

COUNT(*)
----------
50194
这里我们发现commit的时间会有些长,因为同时要刷新物化视图,我们这里其实是重新做了删除物化视图数据和插入新数据的操作(因为刷新的方法是complete,当然你可以选择FAST来做增量刷新,而且fast是首选),然后物化视图已经更新了。
下面是开启session sql trace的结构,你可以看到commit之后oralce所做的操作。
********************************************************************************

commit

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.11 0.23 0 0 1 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.11 0.23 0 0 1 0

Misses in library cache during parse: 0
Parsing user id: 54
********************************************************************************

SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE
NO_PARALLEL(SAMPLESUB) opt_param('parallel_execution_enabled', 'false')
NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_0"),
NVL(SUM(C2),:"SYS_B_1")
FROM
(SELECT /*+ NO_PARALLEL("MV_TEST_INDEX") FULL("MV_TEST_INDEX")
NO_PARALLEL_INDEX("MV_TEST_INDEX") */ :"SYS_B_2" AS C1, :"SYS_B_3" AS C2
FROM "SCOTT"."MV_TEST_INDEX" SAMPLE BLOCK (:"SYS_B_4" , :"SYS_B_5") SEED
(:"SYS_B_6") "MV_TEST_INDEX") SAMPLESUB

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.07 0.19 44 69 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 3 0.07 0.19 44 69 0 1

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 (recursive depth: 2)

Rows Row Source Operation
------- ---------------------------------------------------
1 SORT AGGREGATE (cr=69 pr=44 pw=0 time=196762 us)
10624 MAT_VIEW ACCESS SAMPLE MV_TEST_INDEX (cr=69 pr=44 pw=0 time=1853189 us)

********************************************************************************

delete from "SCOTT"."MV_TEST_INDEX"

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.02 0.01 0 3 0 0
Execute 1 7.48 9.46 20 321 154984 50194
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 7.50 9.48 20 324 154984 50194

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 (recursive depth: 1)

Rows Row Source Operation
------- ---------------------------------------------------
0 DELETE MV_TEST_INDEX (cr=371 pr=20 pw=0 time=9503556 us)
50194 MAT_VIEW ACCESS FULL MV_TEST_INDEX (cr=310 pr=20 pw=0 time=1355940 us)

********************************************************************************

INSERT /*+ */ INTO "SCOTT"."MV_TEST_INDEX"("OBJECT_ID","OBJECT_NAME") SELECT
"TEST_INDEX"."OBJECT_ID","TEST_INDEX"."OBJECT_NAME" FROM
"SCOTT"."TEST_INDEX" "TEST_INDEX"

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.01 0 0 0 0
Execute 1 5.90 12.87 0 777 103790 50193
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 5.91 12.88 0 777 103790 50193

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 54 (recursive depth: 1)

Rows Row Source Operation
------- ---------------------------------------------------
50193 TABLE ACCESS FULL TEST_INDEX (cr=241 pr=0 pw=0 time=602379 us)

********************************************************************************

BEGIN dbms_session.set_sql_trace(false); END;

接下来看看fast的刷新方法:
CREATE MATERIALIZED VIEW LOG ON scott.test_index; --这里我试过yantinkun的那个网页,是不能加with rowid的,会报错:ORA-23415: materialized view log for does not record the primary key
DROP materialized view log on scott.test_index;
create materialized view scott.MV_test_index
refresh fast on commit
as
select * from scott.test_index;

SQL> exec dbms_session.set_sql_trace(true);

PL/SQL procedure successfully completed.

SQL> delete from test_index where rownum=1;

1 row deleted.

SQL> commit;

Commit complete.

SQL> exec dbms_session.set_sql_trace(false);

PL/SQL procedure successfully completed.

SQL> host
这次的commit快多了,因为只是增量的刷新;
看下log中有这样一行:
DELETE FROM "SCOTT"."MV_TEST_INDEX" SNAP$
WHERE
"OBJECT_ID" = :1
只是找到了多出来的那个object的id,然后从物化视图里删掉就ok了。
可以查看物化视图的开始刷新时间,通过查看视图
select * from mlog$ where mowner='SCOTT' and MASTER='TEST_INDEX'来查找对应建立的物化视图的log,我这里查出来的是scott.MLOG$_TEST_INDEX
然后执行查询就可以看到详细的信息了:
select * from scott.MLOG$_TEST_INDEX

然后是刷新的时间,当刷新选项是commit的时候你是没法看的,只能从session的trace里面估计,
on demand话就是你自定义的job 来执行exec dbms_mview.refresh('MV_TEST_INDEX)
这个是可以看的,可以从user_jobs这个视图来看,里面有个total_time来记录job的执行总时间。追问

total_time 是记录的总时间 这个我知道 但是我要的是每一次执行的时间 或者DBA_jobs 有没有记录表 什么的 可以让我获得上一次的执行的总时间?

追答

额,这个我没见过,不过我有个办法,找到你写的那个job 执行的刷新物化视图的那个过程,
比如:
create table job_exedura (job varchar2(100),start_time date,exedura date);
procedure ref_mv as
date1 date;
exeduration date;
begin
select sysdate into date1 from dual;
exec dbms_mview.refresh('MV_TEST_INDEX)
select sysdate-date1 into exeduration from dual; --这个不就是你的job的执行时间?
insert into job_exedura values('job_ref_mv',date1 , exeduration );
commit;
end;

这样你以后查看这个job的执行情况,不是一目了然了?
只要select * from job_exedura 就ok了
个人意见,仅供探讨,有好方法可以大家研究下

追问

谢谢您的回答! 物化视图的 job是自动生成的 你的意思是写个存储过程 将时间记录到表中 oracle没有提供能够监控物化视图刷新时间 或者job执行时间的方法吗? 我是不想用这种方式 才到网上来找的

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-19
如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间
以下是物化视图的建立,注意是refresh mode是 on demand还是on commit
ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
创建物化视图时未作指定,则Oracle按ON DEMAND模式来创建。本回答被网友采纳

如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视 ...
如何获得oracle物化视图 定时刷新时 刷新所用的时间 或者是监控 物化视图在jobs中建立的job任务的执行时间以下是物化视图的建立,注意是refresh mode是 on demand还是on commitON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦...

Oracle 怎么建立 手动快速刷新的物化视图。和定时刷新的job?
方法一是利用系统自带的定时任务功能。首先,无需事务码的繁琐,只需通过后台执行程序,选择LP01作为输出设备(如图所示),勾选相关设置,如周期性执行(小时、天、周或自定义),并指定执行时间。点击保存,简单几步即可完成。另一种方法是通过T-CODE SM36,选择需要定时执行的程序,确认无误后保存。...

如何查看Oracle物化视图的刷新起始时间和结束时间
DBA_MVIEWS的LAST_REFRESH_DATE字段或者DBA_MVIEW_REFRESH_TIMES的LAST_REFRESH字段记录了Oracle物化视图刷新的起始时间。但如果我们想查看物化视图的刷新到底花费了多长时间,应该怎么做呢。其实,我们可以查询DBA_MVIEW_ANALYSIS。对于完全刷新(Complete),刷新耗时会记录在DBA_MVIEW_ANALYSIS的FULLREFRESHTIM...

如何查看Oracle物化视图的刷新起始时间和结束时间
all_mview_analysis.fullrefreshtim完全刷新所用的时间 all_mview_analysis.increfreshtim增量刷新所用的时间

Oracle设置物化视图的自动刷新
物化视图建立的时候可以定义刷新方式,一般有: refresh fast 和 refresh complete之分,前者是只更新主表中变化的记录(主表必须建立materialized view log),而后者是把MV里面的数据全部更新。此外,更新方式还可以有:on demand, on commit, on force之分. on commit是及时更新。其实用户创建materialized...

Oracle物化视图-看这一篇就可以了
物化视图的刷新时间可以设定为`ON DEMAND`(需要时刷新)、`ON COMMIT`(提交后刷新)或根据特定时间间隔进行定时刷新。三、物化视图的类型与用途 物化视图分为`ON DEMAND`和`ON COMMIT`两种类型,前者在需要时刷新,后者在基表提交后自动刷新。物化视图用于提高查询性能,存储表连接、聚合等操作的结果,...

oracle 做个定时任务(job) 每融五分钟刷新一次物化视图 请问语句要怎 ...
SQL>variable job number;SQL>begin dbms_job.submit(:job,'物化视图存储过程;',sysdate,'sysdate+5\/24\/60');--每天1440分钟,即5分钟运行物化视图过程一次 end;\/

oracle数据库 建立物化视图,提高查询效率
创建物化视图时,可以通过`CREATE MATERIALIZED VIEW`语句指定,支持`ON DEMAND`或`ON COMMIT`两种刷新模式,分别表示仅在需要时刷新或在基表事务提交时立即刷新。默认情况下,物化视图按`ON DEMAND`模式创建。刷新物化视图有三种方法:完全刷新(COMPLETE)、快速刷新(FAST)和FORCE方式。完全刷新会删除表中...

oracle如何创建一个指定时间刷新的视图
使用物化视图就可以了,比如:create materialized view mv_test refresh complete start with to_date('02-08-2010 18:00:00', 'dd-mm-yyyy hh24:mi:ss') --第一次刷新时间 next sysdate+1\/24 --间隔多久刷新一次 as --子查询语句,同普通view一样 select emp.empno,emp.ename,emp.job,...

怎么查看oracle物化视图是怎么生成的
pl\/sql developer 选中这个物化视图,然后点击查看,就能看到创建这个物化视图的语句了 pl\/sql windows 中输入这个物化视图名称有,鼠标右键同样可以查看这个物化视图的创建语句 dbms_metadata.get_ddl 这个函数也可以

相似回答