《Oracle物化視圖實(shí)戰(zhàn)手冊(cè)》
場(chǎng)合:數(shù)據(jù)變化小,查詢出數(shù)據(jù)還要2次利用,需要數(shù)據(jù)雙向同步的場(chǎng)合
視圖:就是一條sql語(yǔ)句,每次查詢時(shí)都要重新生成執(zhí)行計(jì)劃,重新執(zhí)行,非常消耗時(shí)間,放在內(nèi)存中一次性的
物化視圖:執(zhí)行sql并保留結(jié)果,直接放在數(shù)據(jù)文件中,不放在內(nèi)存中方便重用【空間換時(shí)間】,不受開關(guān)機(jī)的影響
1.創(chuàng)建基表并插入數(shù)據(jù)
create table sino_person_address
(
iid NUMBER(16) not null,
ipersonid NUMBER(16),
spin NUMBER(16),
dgettime DATE,
sorgcode VARCHAR2(20),
smsgfilename VARCHAR2(20),
ilineno NUMBER(8),
saddress VARCHAR2(60),
szip CHAR(6),
scondition CHAR(1),
itrust NUMBER(1),
stoporgcode VARCHAR2(14),
istate NUMBER(1),
constraint PK_SINO_PERSON_ADDRESS primary key (iid)
);
插入數(shù)據(jù)(插入自動(dòng)增長(zhǎng)序列號(hào)字段的方法)
INSERT 語(yǔ)句插入這個(gè)字段值為: 序列號(hào)的名稱.NEXTVAL,seq_sino_person_address.nextval
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-08 12:12:12','yyyy-mm-dd hh24:mi:ss'),'110','test_report',111,'beijing
xicheng','100100','1',123,1,'1000',0);
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-09 12:12:12','yyyy-mm-dd hh24:mi:ss'),'120','test_report2',121,'beijing
xicheng','100200','2',123,1,'1002',2);
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-10 12:12:12','yyyy-mm-dd hh24:mi:ss'),'130','test_report3',131,'beijing
xicheng','100300','3',123,1,'1003',3);
commit
###################################################################################################
2.創(chuàng)建物化視圖日志
意義:記錄基表DML操作的變化,實(shí)時(shí)刷新物化視圖
注:包含所有字段
刪除物化視圖日志
drop materialized view log on t
創(chuàng)建物化視圖日志
create materialized view log on t with sequence,rowid (x,y,z) including new values;
參數(shù)說(shuō)明:
with sequence:以序號(hào)增1的方式進(jìn)行變化記錄
rowid (x,y,z):定位哪些數(shù)據(jù)發(fā)生了變化,日志記錄rowid指向的數(shù)據(jù)塊的位置和變化
刪除物化視圖日志
drop materialized view log on sino_person_address;
基于主鍵方式的刷新,創(chuàng)建物化視圖日志
CREATE MATERIALIZED VIEW LOG ON sino_person_address
WITH PRIMARY KEY
INCLUDING NEW VALUES
【TABLESPACE sinojfs2】; 可選項(xiàng)
3.創(chuàng)建物化視圖
創(chuàng)建物化視圖
create materialized view mv_t build immediate refresh fast on commit enable query rewrite as select x,y,z,count(*) from t group by x,y,z;
刪除物化視圖
drop materialized view mv_sino_person_address;
create materialized view mv_sino_person_address
tablespace SINOJFS2
build immediate 創(chuàng)建物化視圖時(shí),立即刷新基表
refresh fast with primary key 支持基于主鍵的快速刷新(增量刷新),基表必須有主鍵
on commit 支持commit動(dòng)作自動(dòng)刷新
enable query rewrite
as select * from sino_person_address;
create materialized view mv_sino_person_address
tablespace SINOJFS2
build immediate
refresh fast with primary key refresh complete全部刷新【全表刷新】可選項(xiàng)
on demand 支持需求時(shí)手工刷新
enable query rewrite
as select * from sino_person_address;
########################################################################################
參數(shù)說(shuō)明:
build immediate:創(chuàng)建物化視圖時(shí),立即刷新基表
refresh fast with primary key:支持基于主鍵的快速刷新(增量刷新),基表必須有主鍵
on commit:基于commit動(dòng)作的自動(dòng)刷新 on demand:基于需求時(shí)的手工刷新
enable query rewrite:支持查詢重新(使用物化視圖代替基表,查詢必須重寫,查詢重寫是透明的并且不需要對(duì)物化視圖有任何權(quán)限,物化視圖可以啟用和禁用查詢重寫)
查詢重寫:select * from t基表,執(zhí)行計(jì)劃走的是mv_t物化視圖,禁用后,執(zhí)行計(jì)劃走的就是t基表了
tablespace SINOJFS2 創(chuàng)建于SINOJFS2表空間
(1)創(chuàng)建方式:BUILD IMMEDIATE(立即生成數(shù)據(jù)), BUILD DEFERRED(下一次刷新時(shí)生新數(shù)據(jù)), ON PREBUILD TABLE(不創(chuàng)建新的數(shù)據(jù)段,用已存在的含有當(dāng)前物化視圖數(shù)據(jù)的表來(lái)代替);
(2)ENABLE | DISABLE QUERY REWRITE指定是否啟用當(dāng)前物化視圖用于查詢重寫,啟用該選項(xiàng)時(shí),系統(tǒng)會(huì)檢查以保證查詢的可確定性(不允許有如序列數(shù),USER, DATE等不確定的返回值),DISABLE時(shí)物化視圖照樣可以被刷新;
與物化視圖生效相關(guān)的設(shè)置
(1)初始化參數(shù)JOB_QUEUE_PROCESSES設(shè)置大于零,物化的自動(dòng)刷新操作需要JOB QUEUE進(jìn)程來(lái)執(zhí)行;
(2)初始化參數(shù)OPTIMIZER_MODE要設(shè)成某種CBO優(yōu)化模式;
(3)用戶會(huì)話有QUERY_REWRITE(優(yōu)化器能將查詢重寫到本方案物化視圖)或GLOBAL_QUERY_REWRITE(優(yōu)化器能將查詢重寫到其它方案的物化視圖)系統(tǒng)權(quán)限;
(4)初始化參數(shù)QUERY_REWRITE_ENABLED 指示優(yōu)化器是否動(dòng)態(tài)重寫查詢來(lái)使用物化視圖,這個(gè)參數(shù)可以在四個(gè)級(jí)別上進(jìn)行設(shè)置(參數(shù)文件,ALTER SYSTEM, ALTER SESSION, HINTS);
(5)初始化參數(shù)QUERY_REWRITE_INTEGRITY 指示優(yōu)化器在不同的數(shù)據(jù)一致性情況下決定是否使用物化視圖來(lái)重寫查詢,ENFORCED(只有在能確保數(shù)據(jù)一致的前提下才使用物化視圖), TRUSTED(數(shù)據(jù)不一定一致,只要有用維度對(duì)象定義的關(guān)系存在,就可使用物化視圖), STALE_TOLERATED(數(shù)據(jù)不一致,也沒(méi)有相關(guān)的維度定義時(shí)仍可使用物化視圖),這個(gè)參數(shù)可以在三個(gè)級(jí)別上進(jìn)行設(shè)置(參數(shù)文件,ALTER SYSTEM, ALTER SESSION);
4. 物化視圖DML操作測(cè)試
(1)驗(yàn)證物化視圖是否隨記錄增加而增加
insert into sino_person_address values(seq_sino_person_address.nextval,123,to_date('2013-04-11 13:13:13','yyyy-mm-dd hh24:mi:ss'),'140','test_report4',141,'beijing
xicheng','100400','4',123,1,'1004',4);
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄增加而木有刷新,必須commit之后才觸發(fā)物化視圖刷新,沒(méi)有問(wèn)題
exec dbms_mview.refresh('mv_sino_person_address','c'); 還可以手動(dòng)全部刷新【全表刷新】(先清除,再重裝數(shù)據(jù))
exec dbms_mview.refresh('mv_sino_person_address','f'); 也可以快速刷新【增量刷新】借助物化視圖日志,只檢查自上次刷新后改變了的數(shù)據(jù)來(lái)進(jìn)行刷新)
(2)驗(yàn)證物化視圖是否隨記錄刪除而減少
delete from sino_person_address where iid=21;
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄刪除而木有刷新,必須commit之后才觸發(fā)物化視圖刷新,沒(méi)有問(wèn)題
exec dbms_mview.refresh('mv_sino_person_address','c'); 還可以手動(dòng)全部刷新【全表刷新】(先清除,再重裝數(shù)據(jù))
exec dbms_mview.refresh('mv_sino_person_address','f'); 也可以快速刷新【增量刷新】借助物化視圖日志,只檢查自上次刷新后改變了的數(shù)據(jù)來(lái)進(jìn)行刷新)
(3)驗(yàn)證物化視圖是否隨記錄修改而更新
update sino_person_address set sorgcode='200' where sorgcode='120';
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄修改而木有刷新,必須commit之后才觸發(fā)物化視圖刷新,沒(méi)有問(wèn)題
exec dbms_mview.refresh('mv_sino_person_address','c'); 還可以手動(dòng)全部刷新【全表刷新】(先清除,再重裝數(shù)據(jù))
exec dbms_mview.refresh('mv_sino_person_address','f'); 也可以快速刷新【增量刷新】(借助物化視圖日志,只檢查自上次刷新后改變了的數(shù)據(jù)來(lái)進(jìn)行刷新)
(4)驗(yàn)證物化視圖是否隨truncate而清空
truncate table sino_person_address;
select * from sino_person_address order by dgetdate;
select * from mv_sino_person_address order by dgetdate; 隨記錄truncate而木有清空,必須手動(dòng)truncate table mv_sino_person_address;才能清空(兩者是沒(méi)有關(guān)聯(lián)的),沒(méi)有問(wèn)題
5.物化視圖刷新
根據(jù)業(yè)務(wù)需求,每月定時(shí)刷新。根據(jù)以上條件,選擇使用ORACLE自帶工具DBMS_MVIEW工具包中REFRESH方法對(duì)物化視圖進(jìn)行刷新。該方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是需要刷新的物化視圖名稱,第二個(gè)參數(shù)是刷新方式。我們可以寫存儲(chǔ)過(guò)程,對(duì)每個(gè)物化視圖調(diào)用一次REFRESH方法,也可以使用“,”把物化視圖連接以來(lái),一次刷新。
定義存儲(chǔ)過(guò)程
create or replace procedure pro_mview_refresh
as
begin
dbms_mview.refresh('mv_sino_person_address','f');
end;
/
執(zhí)行存儲(chǔ)過(guò)程
execute pro_mview_refresh;
還可以刷新所有物化視圖 dbms_mview.refresh_all_mviews;
創(chuàng)建存儲(chǔ)過(guò)程
drop procedure pro_refresh_all_mviews;
create or replace procedure pro_refresh_all_mviews
as
i number;
begin
dbms_mview.refresh_all_mviews(number_of_failures=>i);
dbms_output.put_line('number_of_failures=>'||i);
end;
/
執(zhí)行
executepro_refresh_all_mviews;
set serveroutput on;不可放在存儲(chǔ)過(guò)程中,因?yàn)檫@是sqlplus命令,如果你怕忘記或者嫌麻煩可以把set serveroutput on;
寫入/opt/oracle/product/11.2.0/dbhome_1/sqlplus/admin/glogin.sql中,每次使用sqlplus時(shí)自動(dòng)加載這個(gè)文件
如果想用PL/SQL Developer工具訪問(wèn)數(shù)據(jù)庫(kù),請(qǐng)?jiān)贑:\Program Files\PLSQL Developer\Login.sql 文件里添加
-- Autostart Command Window script
set serveroutput on;
這樣以后再使用PL/SQL Developer工具訪問(wèn)數(shù)據(jù)庫(kù)就可以自動(dòng)加載這條命令了
###############################################################################################
研發(fā)人員專用,手動(dòng)刷新,想刷就刷
set serveroutput on; 打開屏幕顯示功能,就可以看到number_of_failures=>0結(jié)果
PL/SQL 匿名塊
declare
i number;
begin
dbms_mview.refresh_all_mviews(number_of_failures=>i);
dbms_output.put_line('number_of_failures=>'||i);
end;
/
number_of_failures=>0
Number_of_failures 表示刷新物化視圖失敗個(gè)數(shù)
采用默認(rèn)refresh force 刷新方式:先試圖用FAST方式刷新,如果失敗再用COMPLETE方式刷新,這是默認(rèn)的刷新方式
注意:
1、 如果需要同時(shí)刷新多個(gè)物化視圖,必須用逗號(hào)把各個(gè)物化視圖名稱連接起來(lái),并對(duì)每個(gè)視圖都要指明刷新方式(f、增量刷新,c、完全刷新,?、強(qiáng)制刷新,從不刷新)。
NEVER REFRESH(不刷新)
REFREST FAST(借助物化視圖日志,只檢查自上次刷新后改變了的數(shù)據(jù)來(lái)進(jìn)行刷新)
REFRESH COMPLETE(先清除,再重裝數(shù)據(jù))
REFRESH FORCE(先試圖用FAST方式刷新,如果失敗再用COMPLETE方式刷新,這是默認(rèn)的刷新方式)
確定刷新時(shí)機(jī):
ON COMMIT(事務(wù)提交時(shí)刷新),
ON DEMAND(用DBMS_MVIEW.REFRESH, DBMS_MVIEW.REFRESH_DEPENDENT, DBMS_MVIEW.REFRESH_ALL_MVIEWS來(lái)手工刷新),
By Time(用START WITH 和 NEXT 子句創(chuàng)建的job來(lái)定時(shí)自動(dòng)刷新);
[dbms_mview.refresh('mv_sino_person_address,mv_person_address_his','ff');]
2、當(dāng)日志和物化視圖創(chuàng)建好后,刪除日志,則需要重新創(chuàng)建物化視圖,否則無(wú)法增量刷新。
drop materialized view log on sino_person_address; 刪除日志
SQL> exec dbms_mview.refresh('mv_sino_person_address','c'); 刪除物化視圖日志,只可以支持物化視圖全部刷新
PL/SQL procedure successfully completed
#################################################################################
SQL> exec dbms_mview.refresh('mv_sino_person_address','f'); 無(wú)法增量刷新
begin dbms_mview.refresh('mv_sino_person_address','f'); end;
ORA-23413: 表 "SINOJFS"."SINO_PERSON_ADDRESS" 沒(méi)有實(shí)體化視圖日志
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2558
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2771
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2740
ORA-06512: 在 line 2
SQL> create materialized view log on sino_person_employment 重新創(chuàng)建物化視圖日志
2 with primary key
3 including new values;
Materialized view log created
SQL> exec dbms_mview.refresh('mv_sino_person_employment','f'); 但還是不支持增量刷新,因?yàn)槿罩緝?nèi)容和原表內(nèi)容不一致了
begin dbms_mview.refresh('mv_sino_person_employment','f'); end;
ORA-12034: "SINOJFS"."SINO_PERSON_EMPLOYMENT" 上的實(shí)體化視圖日志比上次刷新后的內(nèi)容新
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2558
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2771
ORA-06512: 在 "SYS.DBMS_SNAPSHOT", line 2740
ORA-06512: 在 line 2
因?yàn)椋簛G失了刪除日志那一點(diǎn)->重建日志那一點(diǎn)之間的原表DML變化,因此日志內(nèi)容和原表內(nèi)容不一致了
解決方案:重建物化視圖日志 重新【增量刷新】和【全表刷新】一遍
SQL> drop materialized view log on sino_loan_compact; 刪除日志
Materialized view log dropped
SQL> create materialized view log on sino_loan_compact 重建日志
2 with primary key
3 including new values;
Materialized view log created
SQL> exec dbms_mview.refresh('mv_sino_loan_compact','c'); 必須先全表刷新
PL/SQL procedure successfully completed
SQL> exec dbms_mview.refresh('mv_sino_loan_compact','f'); 再增量刷新,否則ORA-12034: "SINOJFS"."SINO_LOAN_COMPACT" 上的實(shí)體化視圖日志比上次刷新后的內(nèi)容新
PL/SQL procedure successfully completed
小結(jié):只要能夠增量刷新,說(shuō)明日志沒(méi)有問(wèn)題了
簡(jiǎn)述所有視圖的快速刷新和全表刷新命令(測(cè)試使用) 10張視圖
select owner,table_name,tablespace_name,status from dba_tables where table_name in ('SINO_LOAN_APPLY');
update SINO_LOAN_APPLY set sorgcode ='1000' where iid =858;
exec dbms_mview.refresh('mv_sino_loan_compact','c');
exec dbms_mview.refresh('mv_sino_loan_compact','f');
exec dbms_mview.refresh('mv_sino_loan_apply','c');
exec dbms_mview.refresh('mv_sino_loan_apply','f');
exec dbms_mview.refresh('mv_sino_loan_spec_trade','c');
exec dbms_mview.refresh('mv_sino_loan_spec_trade','f');
exec dbms_mview.refresh('mv_sino_loan','c');
exec dbms_mview.refresh('mv_sino_loan','f');
exec dbms_mview.refresh('mv_sino_loan_guarantee','c');
exec dbms_mview.refresh('mv_sino_loan_guarantee','f');
exec dbms_mview.refresh('mv_sino_loan_investor','c');
exec dbms_mview.refresh('mv_sino_loan_investor','f');
###############################################################################
exec dbms_mview.refresh('mv_sino_person_employment','c');
exec dbms_mview.refresh('mv_sino_person_employment','f');
exec dbms_mview.refresh('mv_sino_person_address','c');
exec dbms_mview.refresh('mv_sino_person_address','f');
exec dbms_mview.refresh('mv_sino_person_certification','c');
exec dbms_mview.refresh('mv_sino_person_certification','f');
exec dbms_mview.refresh('mv_sino_person','c');
exec dbms_mview.refresh('mv_sino_person','f');
3.基表增加字段后對(duì)應(yīng)物化視圖不能自動(dòng)同步結(jié)構(gòu)
業(yè)務(wù)表增加 上報(bào)狀態(tài) 字段 ipbcstate number(1) 可以為空
文檔 建模 腳本 物化視圖
sino_person_certification 完成 完成 完成 完成
sino_person 完成 完成 完成 完成
sino_person_address 完成 完成 完成 完成
sino_person_employment 完成 完成 完成 完成
sino_person_address_his 完成 完成 完成
sino_person_employment_his 完成 完成 完成
sino_person_his 完成 完成 完成
sino_loan 完成 完成 完成 完成
sino_loan_compact 完成 完成 完成 完成
sino_loan_spec_trade 完成 完成 完成 完成
sino_loan_guarantee 完成 完成 完成 完成
sino_loan_investor 完成 完成 完成 完成
sino_loan_apply 完成 完成 完成 完成
對(duì)比IPBCSTATE 字段基表有,但物化視圖沒(méi)有,需要重建物化視圖解決
select * from mv_sino_loan_compact where rownum<2;
select * from sino_loan_compact where rownum<2;
select * from mv_sino_loan where rownum < 2;
select * from sino_loan where rownum < 2;
select * from mv_sino_loan_apply where rownum < 2;
select * from sino_loan_apply where rownum < 2;
select * from mv_sino_loan_guarantee where rownum < 2;
select * from sino_loan_guarantee where rownum < 2;
select * from mv_sino_loan_guarantee where rownum < 2;
select * from sino_loan_guarantee where rownum < 2;
select * from mv_sino_loan_investor where rownum < 2;
select * from sino_loan_investor where rownum < 2;
select * from mv_sino_loan_spec_trade where rownum < 2;
select * from sino_loan_spec_trade where rownum < 2;
################################################################################
select * from mv_sino_person where rownum < 2;
select * from sino_person where rownum < 2;
select * from mv_sino_person_address where rownum < 2;
select * from sino_person_address where rownum < 2;
select * from mv_sino_person_certification where rownum < 2;
select * from sino_person_certification where rownum < 2;
select * from mv_sino_person_employment where rownum < 2;
select * from sino_person_employment where rownum < 2;
##################################################################################
4.因?yàn)樯厦鎸懙奈锘晥D是基于主鍵進(jìn)行刷新的,因此原表必須要有主鍵
6.定時(shí)刷新JOB
確定執(zhí)行時(shí)間間隔
1)、 每分鐘執(zhí)行
Interval => TRUNC(sysdate,'mi') + 1 / (24*60)
2)、 每天定時(shí)執(zhí)行
例如:每天下午2點(diǎn)執(zhí)行一次pro_mview_refresh存儲(chǔ)過(guò)程
Interval => TRUNC(sysdate) + 1 +14/ (24)
3)、 每周定時(shí)執(zhí)行
例如:每周一凌晨2點(diǎn)執(zhí)行
Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天
4)、 每月定時(shí)執(zhí)行
例如:每月1日凌晨2點(diǎn)執(zhí)行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
5)、 每季度定時(shí)執(zhí)行
例如每季度的第一天凌晨2點(diǎn)執(zhí)行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
6)、 每半年定時(shí)執(zhí)行
例如:每年7月1日和1月1日凌晨2點(diǎn)
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
7)、 每年定時(shí)執(zhí)行
例如:每年1月1日凌晨2點(diǎn)執(zhí)行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24
通過(guò)jobs的使用就能實(shí)現(xiàn)每天或每月的指定時(shí)間執(zhí)行一個(gè)函數(shù)、過(guò)程與命令
set serveroutput on 啟動(dòng)屏幕輸出功能
SQL> execute dbms_output.put_line('This is'); 已經(jīng)可以正常輸出
This is
創(chuàng)建作業(yè)
variable job_num number; 定義存儲(chǔ)job編號(hào)的變量
declare job_num number; pro_refresh_all_mviews
begin
dbms_job.submit
(job=>:job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'sysdate+1/1440'); 每天1440分鐘,每一分鐘運(yùn)行pro_mview_refresh過(guò)程一次
dbms_output.put_line('Job Number is'||to_char(job_num));
commit;
end;
/
############################################################################################
綁定變量版,必須先定義變量
variable job_num number;
declare job_num number;
begin
dbms_job.submit
(job=>:job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'trunc(SYSDATE+5/1440,''MI'')'); 每5分鐘運(yùn)行一次job
dbms_output.put_line('Job Number is'||to_char(job_num));
commit;
end;
/
例如:每天上午10點(diǎn)執(zhí)行一次pro_refresh_all_mviews存儲(chǔ)過(guò)程
Interval => TRUNC(sysdate) + 1 +10/ (24)
declare job_num number;
begin
dbms_job.submit
(job=>:job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'trunc(SYSDATE)+1+10/24'); 每天上午10點(diǎn)運(yùn)行一次job
dbms_output.put_line('Job Number is'||to_char(job_num));
commit;
end;
/
Job Number is
PL/SQL procedure successfully completed
job_num
---------
1
####################################################################################
PL/SQL 匿名塊版,可以直接在塊中定義變量,比較方面現(xiàn)在采用這種
declare
job_num number;
begin
dbms_job.submit
(job=>job_num,
what=>'pro_refresh_all_mviews;',
next_date=>sysdate,
interval=>'trunc(SYSDATE)+1+10/24');
dbms_output.put_line('Job Number is '||job_num);
commit;
end;
/
Job Number is 4
PL/SQL procedure successfully completed
####################################################################################
dbms_job.submit( job out binary_integer,
what in varchar2,
next_date in date,
interval in varchar2,
no_parse in boolean)
●job:輸出變量,這是作業(yè)在作業(yè)隊(duì)列中的編號(hào);
●what:執(zhí)行作業(yè)的存儲(chǔ)過(guò)程及其輸入?yún)?shù);
●next_date:作業(yè)初次執(zhí)行的時(shí)間;
●interval:作業(yè)執(zhí)行的時(shí)間間隔。指上一次執(zhí)行結(jié)束到下一次開始執(zhí)行的時(shí)間間隔
其中Interval這個(gè)值是決定Job何時(shí),被重新執(zhí)行的關(guān)鍵;當(dāng)interval設(shè)置為null時(shí),該job執(zhí)行結(jié)束后,就被從隊(duì)列中刪除。假如我們需要該job周期性地執(zhí)行,則要用‘sysdate+m’表示。如何更好地確定執(zhí)行時(shí)間的間隔需要我們掌握一個(gè)函數(shù)TRUNC。
SQL> show parameter job_queue_process 作業(yè)隊(duì)列進(jìn)程數(shù),oracle能夠并發(fā)job數(shù)量,0~1000
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 1000
Oracle提供的數(shù)據(jù)字典user_jobs監(jiān)控作業(yè)狀態(tài)
SQL> select job,log_user,what,last_date,last_sec,next_date,next_sec,failures,broken from user_jobs;
Job 作業(yè)唯一編號(hào)
Log_user 提交作業(yè)的用戶
What 作業(yè)執(zhí)行的存儲(chǔ)過(guò)程
Last_date 最后一次成功運(yùn)行作業(yè)的日期
Last_sec 最后一次成功運(yùn)行作業(yè)的時(shí)間
Next_date 下一次運(yùn)行作業(yè)日期
Next_sec 下一次運(yùn)行作業(yè)時(shí)間
Failures 執(zhí)行失敗次數(shù),當(dāng)執(zhí)行job出現(xiàn)錯(cuò)誤時(shí),Oracle將其記錄在日志里,失敗次數(shù)每次自動(dòng)加1,加到16之后Oracle就不在執(zhí)行它了
Broken 是否是異常作業(yè),當(dāng)執(zhí)行失敗次數(shù)達(dá)到16時(shí),Oracle就將該job標(biāo)志為broken。此后,Oracle不再繼續(xù)執(zhí)行它,直到用戶調(diào)用過(guò)程dbms_job.broken,重新設(shè)置為not broken,或強(qiáng)制調(diào)用dbms_job.run來(lái)重新執(zhí)行它。Y標(biāo)示作業(yè)中斷,以后不會(huì)運(yùn)行,N表示作業(yè)正常,可以運(yùn)行
運(yùn)行作業(yè)
begin
dbms_job.run(:job_num); job_num是存儲(chǔ)job編號(hào)的變量
end;
查詢作業(yè)狀態(tài)
SQL> select job,log_user,what,last_date,last_sec,next_date,next_sec,failures,broken from user_jobs;
JOB LOG_USER WHAT LAST_DATE LAST_SEC NEXT_DATE NEXT_SEC FAILURES BROKEN
---------- --------- ---------------------------------------------------- ----------- ---------------- -----------
1 SINOJFS pro_refresh_all_mviews; 2013-4-26 1 11:27:38 2013-4-27 1 10:00:00 0 N
Job 作業(yè)唯一編號(hào)
Log_user 提交作業(yè)的用戶
What 作業(yè)執(zhí)行的存儲(chǔ)過(guò)程
Last_date 最后一次成功運(yùn)行作業(yè)的日期
Last_sec 最后一次成功運(yùn)行作業(yè)的時(shí)間
Next_date 下一次運(yùn)行作業(yè)日期
Next_sec 下一次運(yùn)行作業(yè)時(shí)間
Failures 執(zhí)行失敗次數(shù),當(dāng)執(zhí)行job出現(xiàn)錯(cuò)誤時(shí),Oracle將其記錄在日志里,失敗次數(shù)每次自動(dòng)加1,加到16之后Oracle就不在執(zhí)行它了
Broken 是否是異常作業(yè),當(dāng)執(zhí)行失敗次數(shù)達(dá)到16時(shí),Oracle就將該job標(biāo)志為broken。此后,Oracle不再繼續(xù)執(zhí)行它,直到用戶調(diào)用過(guò)程dbms_job.broken,重新設(shè)置為not broken;
或強(qiáng)制調(diào)用dbms_job.run來(lái)重新執(zhí)行它。Y標(biāo)示作業(yè)中斷,以后不會(huì)運(yùn)行,N表示作業(yè)正常,可以運(yùn)行
刪除作業(yè)
begin
dbms_job.remove(:job_num);
end;
修改作業(yè)
dbms_job.remove(jobno); 刪除job號(hào)
例 execute dbms_job.remove(1);
######################################################################
dbms_job.what(jobno,what); 修改執(zhí)行的存儲(chǔ)過(guò)程
dbms_job.next_date(job,next_date)修改下次執(zhí)行的時(shí)間
例 exec dbms_job.next_date(46,sysdate+2/(24*60)); 46作業(yè)號(hào)
#####################################################################
dbms_job.interval(job,interval) :修改間隔時(shí)間
例 exec dbms_job.interval(46,sysdate+3/(24*60));
######################################################################
dbms_job.broken(job,true) 中斷job
例 exec dbms_job.broken(46,true); 46作業(yè)號(hào) exec dbms_job.broken(2,true) BROKEN=Y
#######################################################################
dbms_job.broken(job,false,next_date) next_date:下次執(zhí)行時(shí)間,如果不填則馬上啟動(dòng)job
例 exec dbms_job.broken(46,false); 啟動(dòng)job exec dbms_job.broken(2,false); BROKEN=N
########################################################################
dbms_job.run(jobno); 運(yùn)行作業(yè)
例子 execute dbms_job.run(1);
一. 物化視圖概述
Oracle的物化視圖是包括一個(gè)查詢結(jié)果的數(shù)據(jù)庫(kù)對(duì)像,它是遠(yuǎn)程數(shù)據(jù)的的本地副本,或者用來(lái)生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲(chǔ)基于遠(yuǎn)程表的數(shù)據(jù),也可以稱為快照。
物化視圖可以用于預(yù)先計(jì)算并保存表連接或聚集等耗時(shí)較多的操作的結(jié)果,這樣,在執(zhí)行查詢時(shí),就可以避免進(jìn)行這些耗時(shí)的操作,而從快速的得到結(jié)果。物化視圖有很多方面和索引很相似:使用物化視圖的目的是為了提高查詢性能;物化視圖對(duì)應(yīng)用透明,增加和刪除物化視圖不會(huì)影響應(yīng)用程序中SQL語(yǔ)句的正確性和有效性;物化視圖需要占用存儲(chǔ)空間;當(dāng)基表發(fā)生變化時(shí),物化視圖也應(yīng)當(dāng)刷新。
物化視圖可以查詢表,視圖和其它的物化視圖。
通常情況下,物化視圖被稱為主表(在復(fù)制期間)或明細(xì)表(在數(shù)據(jù)倉(cāng)庫(kù)中)。
對(duì)于復(fù)制,物化視圖允許你在本地維護(hù)遠(yuǎn)程數(shù)據(jù)的副本,這些副本是只讀的。如果你想修改本地副本,必須用高級(jí)復(fù)制的功能。當(dāng)你想從一個(gè)表或視圖中抽取數(shù)據(jù)時(shí),你可以用從物化視圖中抽取。
對(duì)于數(shù)據(jù)倉(cāng)庫(kù),創(chuàng)建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。
在復(fù)制環(huán)境下,創(chuàng)建的物化視圖通常情況下主鍵,rowid,和子查詢視圖。
物化視圖由于是物理真實(shí)存在的,故可以創(chuàng)建索引。
1.1 物化視圖可以分為以下三種類型
(1) 包含聚集的物化視圖;
(2) 只包含連接的物化視圖;
(3) 嵌套物化視圖。
三種物化視圖的快速刷新的限制條件有很大區(qū)別,而對(duì)于其他方面則區(qū)別不大。創(chuàng)建物化視圖時(shí)可以指定多種選項(xiàng),下面對(duì)幾種主要的選擇進(jìn)行簡(jiǎn)單說(shuō)明:
(1)創(chuàng)建方式(BuildMethods):包括BUILD IMMEDIATE和BUILD DEFERRED兩種。
BUILD IMMEDIATE是在創(chuàng)建物化視圖的時(shí)候就生成數(shù)據(jù)。
BUILD DEFERRED則在創(chuàng)建時(shí)不生成數(shù)據(jù),以后根據(jù)需要在生成數(shù)據(jù)。默認(rèn)為BUILD IMMEDIATE。
(2)查詢重寫(QueryRewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。
分別指出創(chuàng)建的物化視圖是否支持查詢重寫。查詢重寫是指當(dāng)對(duì)物化視圖的基表進(jìn)行查詢時(shí),Oracle會(huì)自動(dòng)判斷能否通過(guò)查詢物化視圖來(lái)得到結(jié)果,如果可以,則避免了聚集或連接操作,而直接從已經(jīng)計(jì)算好的物化視圖中讀取數(shù)據(jù)。默認(rèn)為DISABLEQUERY REWRITE。
(3)刷新(Refresh):指當(dāng)基表發(fā)生了DML操作后,物化視圖何時(shí)采用哪種方式和基表進(jìn)行同步。刷新的模式有兩種:ON DEMAND和ON COMMIT。
ON DEMAND和ON COMMIT物化視圖的區(qū)別在于其刷新方法的不同,ON DEMAND指物化視圖在用戶需要的時(shí)候進(jìn)行刷新,可以手工通過(guò)DBMS_MVIEW.REFRESH等方法來(lái)進(jìn)行刷新,也可以通過(guò)JOB定時(shí)進(jìn)行刷新,即更新物化視圖,以保證和基表數(shù)據(jù)的一致性;而ON COMMIT是說(shuō),一旦基表有了COMMIT,即事務(wù)提交,則立刻刷新,立刻更新物化視圖,使得數(shù)據(jù)和基表一致。
對(duì)基表,平常的COMMIT在0.01秒內(nèi)可以完成,但在有了ON COMMIT視圖后,居然要6秒。速度減低了很多倍。ON COMMIT視圖對(duì)基表的影響可見(jiàn)一斑。
1.2 物化視圖,根據(jù)不同的著重點(diǎn)可以有不同的分類:
1) 按刷新方式分:FAST/COMPLETE/FORCE
2) 按刷新時(shí)間的不同:ON DEMAND/ON COMMIT
3) 按是否可更新:UPDATABLE/READ ONLY
4) 按是否支持查詢重寫:ENABLE QUERY REWRITE/DISABLEQUERY REWRITE
默認(rèn)情況下,如果沒(méi)指定刷新方法和刷新模式,則Oracle默認(rèn)為FORCE和DEMAND。
注意:設(shè)置REFRESH ON COMMIT的物化視圖不能訪問(wèn)遠(yuǎn)端對(duì)象。
在建立物化視圖的時(shí)候可以指定ORDER BY語(yǔ)句,使生成的數(shù)據(jù)按照一定的順序進(jìn)行保存。不過(guò)這個(gè)語(yǔ)句不會(huì)寫入物化視圖的定義中,而且對(duì)以后的刷新也無(wú)效。
1.3 物化視圖有三種刷新方式:COMPLETE、FAST和 FORCE。
1) 完全刷新(COMPLETE)會(huì)刪除表中所有的記錄(如果是單表刷新,可能會(huì)采用TRUNCATE的方式),然后根據(jù)物化視圖中查詢語(yǔ)句的定義重新生成物化視圖。
2) 快速刷新(FAST)采用增量刷新的機(jī)制,只將自上次刷新以后對(duì)基表進(jìn)行的所有操作刷新到物化視圖中去。FAST必須創(chuàng)建基于主表的視圖日志。
對(duì)于增量刷新選項(xiàng),如果在子查詢中存在分析函數(shù),則物化視圖不起作用。
3) 采用FORCE方式,Oracle會(huì)自動(dòng)判斷是否滿足快速刷新的條件,如果滿足則進(jìn)行快速刷新,否則進(jìn)行完全刷新。
Oracle物化視圖的快速刷新機(jī)制是通過(guò)物化視圖日志完成的。Oracle通過(guò)一個(gè)物化視圖日志還可以支持多個(gè)物化視圖的快速刷新。
物化視圖日志根據(jù)不同物化視圖的快速刷新的需要,可以建立為ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
1.4 物化視圖Refresh子句的其他說(shuō)明與示例
REFRESH 子句可以包含如下部分:
[refresh [fast|complete|force]
[on demand | commit]
[start with date] [next date]
[with {primary key|rowid}]]
1.4.1 主鍵和ROWD子句:
WITH PRIMARY KEY選項(xiàng)生成主鍵物化視圖,也就是說(shuō)物化視圖是基于主表的主鍵,而不是ROWID(對(duì)應(yīng)于ROWID子句). PRIMARY KEY是默認(rèn)選項(xiàng),為了生成PRIMARY KEY子句,應(yīng)該在主表上定義主鍵,否則應(yīng)該用基于ROWID的物化視圖.
基于ROWID物化視圖只有一個(gè)單一的主表,不能包括下面任何一項(xiàng):
(1).Distinct 或者聚合函數(shù).
(2) .Group by,子查詢,連接和SET操作
--主鍵(PrimaryKey)物化視圖示例:
在遠(yuǎn)程數(shù)據(jù)庫(kù)表emp上創(chuàng)建主鍵物化視圖:
- CREATEMATERIALIZEDVIEW mv_emp_pk
- REFRESHFASTSTARTWITHSYSDATE
- NEXT SYSDATE + 1/48
- WITHPRIMARYKEY
- ASSELECT * FROM emp@remote_db
CREATEMATERIALIZEDVIEW mv_emp_pk
REFRESHFASTSTARTWITHSYSDATE
NEXT SYSDATE + 1/48
WITHPRIMARYKEY
ASSELECT * FROM emp@remote_db
--當(dāng)用FAST選項(xiàng)創(chuàng)建物化視圖,必須創(chuàng)建基于主表的視圖日志,如下:
- CREATEMATERIALIZEDVIEWLOGON emp;
CREATEMATERIALIZEDVIEWLOGON emp;
--Rowid物化視圖示例:
下面的語(yǔ)法在遠(yuǎn)程數(shù)據(jù)庫(kù)表emp上創(chuàng)建Rowid物化視圖
- CREATEMATERIALIZEDVIEW mv_emp_rowid
- REFRESHWITHROWID
- ASSELECT * FROM emp@remote_db;
- Materializedviewlog created.
CREATEMATERIALIZEDVIEW mv_emp_rowid
REFRESHWITHROWID
ASSELECT * FROM emp@remote_db;
Materializedviewlog created.
--子查詢物化視圖示例:
在遠(yuǎn)程數(shù)據(jù)庫(kù)表emp上創(chuàng)建基于emp和dept表的子查詢物化視圖
- CREATEMATERIALIZEDVIEW mv_empdept
- ASSELECT * FROM emp@remote_db e
- WHEREEXISTS
- (SELECT * FROM dept@remote_db d
- WHEREe.dept_no = d.dept_no)
CREATEMATERIALIZEDVIEW mv_empdept
ASSELECT * FROM emp@remote_db e
WHEREEXISTS
(SELECT * FROM dept@remote_db d
WHEREe.dept_no = d.dept_no)
1.4.2 刷新時(shí)間
START WITH子句通知數(shù)據(jù)庫(kù)完成從主表到本地表第一次復(fù)制的時(shí)間,應(yīng)該及時(shí)估計(jì)下一次運(yùn)行的時(shí)間點(diǎn), NEXT 子句說(shuō)明了刷新的間隔時(shí)間.
- CREATEMATERIALIZEDVIEW mv_emp_pk
- REFRESHFAST
- STARTWITHSYSDATE
- NEXT SYSDATE + 2
- WITHPRIMARYKEY
- ASSELECT * FROM emp@remote_db;
CREATEMATERIALIZEDVIEW mv_emp_pk
REFRESHFAST
STARTWITHSYSDATE
NEXT SYSDATE + 2
WITHPRIMARYKEY
ASSELECT * FROM emp@remote_db;
在上面的例子中,物化視圖數(shù)據(jù)的第一個(gè)副本在創(chuàng)建時(shí)生成,以后每?jī)商焖⑿乱淮?
- creatematerializedviewMV_LVY_LEVYDETAILDATA
- TABLESPACE ZGMV_DATA
- BUILDDEFERRED
- refreshforce
- ondemand
- startwith to_date('24-11-200518:00:10', 'dd-mm-yyyyhh24:mi:ss')
- nextTRUNC(SYSDATE+1)+18/24
- as
- SELECT * FROM emp@remote_db;
creatematerializedviewMV_LVY_LEVYDETAILDATA
TABLESPACE ZGMV_DATA --保存表空間
BUILDDEFERRED--延遲刷新不立即刷新
refreshforce--如果可以快速刷新則進(jìn)行快速刷新,否則完全刷新
ondemand--按照指定方式刷新
startwith to_date('24-11-200518:00:10', 'dd-mm-yyyyhh24:mi:ss') --第一次刷新時(shí)間
nextTRUNC(SYSDATE+1)+18/24--刷新時(shí)間間隔
as
SELECT * FROM emp@remote_db;
1.5 ON PREBUILD TABLE 說(shuō)明
在創(chuàng)建物化視圖時(shí)指明ON PREBUILD TABLE語(yǔ)句,可以將物化視圖建立在一個(gè)已經(jīng)存在的表上。這種情況下,物化視圖和表必須同名。當(dāng)刪除物化視圖時(shí),不會(huì)刪除同名的表。
這種物化視圖的查詢重寫要求參數(shù)QUERY_REWRITE_INTEGERITY必須設(shè)置為trusted或者stale_tolerated。
1.6 物化視圖分區(qū)
物化視圖可以進(jìn)行分區(qū)。而且基于分區(qū)的物化視圖可以支持分區(qū)變化跟蹤(PCT)。具有這種特性的物化視圖,當(dāng)基表進(jìn)行了分區(qū)維護(hù)操作后,仍然可以進(jìn)行快速刷新操作。對(duì)于聚集物化視圖,可以在GROUP BY列表中使用CUBE或ROLLUP,來(lái)建立不同等級(jí)的聚集物化視圖。
相關(guān)內(nèi)容參考:
Oracle 物化視圖日志 與 快速刷新 說(shuō)明
http://blog.csdn.net/tianlesoftware/article/details/7720580
Oracle 物化視圖 詳細(xì)錯(cuò)誤描述 查看方法
http://blog.csdn.net/tianlesoftware/article/details/7719789
Oracle 物化視圖 快速刷新 限制 說(shuō)明
http://blog.csdn.net/tianlesoftware/article/details/7719679
二. 物化視圖操作示例
1. 創(chuàng)建物化視圖需要的權(quán)限:
- GRANT CREATE MATERIALIZED VIEW TO USER_NAME;
GRANT CREATE MATERIALIZED VIEW TO USER_NAME;
2. 在源表建立物化視圖日志
- CREATE MATERIALIZED VIEW LOG ON DAVE
- TABLESPACE&BISONCU_SPACE
- WITH PRIMARY KEY;
CREATE MATERIALIZED VIEW LOG ON DAVE
TABLESPACE&BISONCU_SPACE -- 日志空間
WITH PRIMARY KEY; -- 指定為主鍵類型
3. 授權(quán)給中間用戶
- GRANT SELECT ON DAVE TO ANQING;
- GRANT SELECT ON MLOG$_DAVE TO ANQING;
GRANT SELECT ON DAVE TO ANQING;
GRANT SELECT ON MLOG$_DAVE TO ANQING;
4. 在目標(biāo)數(shù)據(jù)庫(kù)上創(chuàng)建MATERIALIZED VIEW
- CREATE MATERIALIZED VIEW AICS_DAVE
- TABLESPACE&BISONCS_SPACE
- REFRESH FAST
- ON DEMAND
-
-
- START WITH SYSDATE
-
-
- NEXT SYSDATE+1/24/20
- WITH PRIMARY KEY
-
- DISABLE QUERY REWRITE AS
- SELECT MODEL_ID, STATUS,MODEL_NAME, MANU_ID, DESCRIPTION, CREATE_TIME, UPDATE_TIME, SW_VERSION
- FROM AICS_DAVE@LINK_DAVE;
CREATE MATERIALIZED VIEW AICS_DAVE
TABLESPACE&BISONCS_SPACE
REFRESH FAST
ON DEMAND
--第一次刷新時(shí)間
--START WITH to_date('2012-01-01 20:00:00', 'yyyy-mm-dd hh24:mi:ss')
START WITH SYSDATE
--刷新時(shí)間間隔。每1天刷新一次,時(shí)間為凌晨2點(diǎn)
--NEXT TRUNC(SYSDATE,'dd')+1+2/24
NEXT SYSDATE+1/24/20
WITH PRIMARY KEY
--USING DEFAULT LOCAL ROLLBACKSEGMENT
DISABLE QUERY REWRITE AS
SELECT MODEL_ID, STATUS,MODEL_NAME, MANU_ID, DESCRIPTION, CREATE_TIME, UPDATE_TIME, SW_VERSION
FROM AICS_DAVE@LINK_DAVE;
5. 在目標(biāo)物化視圖上創(chuàng)建索引
- CREATE INDEX IDX_T_DV_CT
- ON AICS_DEV_INFO (CREATE_TIME, UPDATE_TIME)
- TABLESPACE &BISON_IDX;
-
- CREATE INDEX IDX_T_DV_UT
- ON AICS_DEV_INFO (UPDATE_TIME)
- TABLESPACE &BISON_IDX;
-
- CREATE INDEX I_T_DV_MSISDN
- ON AICS_DEV_INFO (MSISDN)
- TABLESPACE &BISON_IDX;
CREATE INDEX IDX_T_DV_CT
ON AICS_DEV_INFO (CREATE_TIME, UPDATE_TIME)
TABLESPACE &BISON_IDX;
CREATE INDEX IDX_T_DV_UT
ON AICS_DEV_INFO (UPDATE_TIME)
TABLESPACE &BISON_IDX;
CREATE INDEX I_T_DV_MSISDN
ON AICS_DEV_INFO (MSISDN)
TABLESPACE &BISON_IDX;
6. 物化視圖刷新說(shuō)明
(1)使用dbms_mview.refresh 手工刷新
如:
- EXEC DBMS_MVIEW.REFRESH('MV_DAVE');
-
-
- EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'c');
- EXEC DBMS_MVIEW.REFRESH('MV_DAVE','C');
-
-
- EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'f');
- EXEC DBMS_MVIEW.REFRESH('MV_DAVE','F');
EXEC DBMS_MVIEW.REFRESH('MV_DAVE');
--完全刷新
EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'c');
EXEC DBMS_MVIEW.REFRESH('MV_DAVE','C');
--快速刷新
EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'f');
EXEC DBMS_MVIEW.REFRESH('MV_DAVE','F');
(2)使用dbms_refresh.refresh 過(guò)程來(lái)批量刷新MV
如果我們?cè)趧?chuàng)建物化視圖的過(guò)程指定start 和next time的刷新時(shí)間,那么Oracle 會(huì)自動(dòng)創(chuàng)建刷新的job,并采用dbms_refresh.refresh 的方式。
使用這種方式刷新之前需要先make refresh group,然后才可以刷新。
Refreshmake 的語(yǔ)法可以參考:
http://docs.oracle.com/cd/B19306_01/server.102/b14227/rarrefreshpac.htm#i94057
示例:
假設(shè)存在物化視圖MV_T1, MV_T2, MV_T3. 創(chuàng)建refresh group的語(yǔ)法如下:
- SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE, 'SYSDATE+ 1')
-
-
- SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE, 'SYSDATE+ 1')
--刷新整個(gè)refresh group 組:
SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
7. 刪除物化視圖及日志
-
- DROP MATERIALIZED VIEW LOG ON DAVE;
-
- DROP MATERIALIZED VIEW MV_DAVE;
--刪除物化視圖日志:
DROP MATERIALIZED VIEW LOG ON DAVE;
--刪除物化視圖
DROP MATERIALIZED VIEW MV_DAVE;
8. 查看物化視圖刷新狀態(tài)信息
- SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROMUSER_MVIEWS;
- SQL> SELECT NAME, LAST_REFRESH FROM USER_MVIEW_REFRESH_TIMES;
SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROMUSER_MVIEWS;
SQL> SELECT NAME, LAST_REFRESH FROM USER_MVIEW_REFRESH_TIMES;
9. 查詢物化視圖日志:
- SELECT * FROM MLOG$_DAVE;
SELECT * FROM MLOG$_DAVE;