Materialized View(物化視圖)是包括一個查詢結果的數(shù)據(jù)庫對像, 它是遠程數(shù)據(jù)的的本地副本,或者用來生成基于數(shù)據(jù)表求和的匯總表。物化視圖存儲基于遠程表的數(shù)據(jù)堕伪,也可以稱為快照。 這個基本上就說出了物化視圖的本質栗菜,它是一組查詢的結果欠雌。
一. Oracle 10g 物化視圖語法如下:
create materialized view [view_name]
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)
]
as
{創(chuàng)建物化視圖用的查詢語句}
以上是Oracle創(chuàng)建物化視圖(Materialized View,以下簡稱MV)時的常用語法,各參數(shù)的含義如下:
-
refresh [fast|complete|force] 視圖刷新的方式:
fast: 增量刷新.假設前一次刷新的時間為t1,那么使用fast模式刷新物化視圖時,只向視圖中添加t1到當前時間段內,主表變化過的數(shù)據(jù)。 為了記錄這種變化疙筹,建立增量刷新物化視圖還需要一個物化視圖日志表富俄。 create materialized view log on (主表名)。(多張表時腌歉,此語句也生效蛙酪,創(chuàng)建后,原來的表中會多出兩類視圖表:MLOG$_table_name和RUPD$_table_name) complete: 全部刷新翘盖。相當于重新執(zhí)行一次創(chuàng)建視圖的查詢語句。 force: 這是默認的數(shù)據(jù)刷新方式凹蜂。當可以使用fast模式時馍驯,數(shù)據(jù)刷新將采用fast方式;否則使用complete方式玛痊。
-
MV數(shù)據(jù)刷新的時間:
on demand: 在用戶需要刷新的時候刷新汰瘫,這里就要求用戶自己動手去刷新數(shù)據(jù)(可以使用JOB定時刷新); on commit: 當主表中有數(shù)據(jù)提交的時候,立即刷新MV中的數(shù)據(jù)擂煞; start ……:從指定的時間開始混弥,每隔一段時間(由next指定)就刷新一次; 全刷新mv_test物化視圖:
begin
dbms_mview.refresh(TAB=>'MV_TEST',
METHOD=>'COMPLETE',
PARALLELISM=>8);
end;
/
增量刷新:
begin
dbms_mview.refresh(TAB=>'MV_TEST',
METHOD=>'FAST',
PARALLELISM=>1);
end;
/
或者对省,也可以這樣執(zhí)行:
exec dbms_mview.refresh('MV_TEST','F');
dbms_mview.refresh('表名', 'F') --快速刷新蝗拿,也就是增量刷新
dbms_mview.refresh('表名', 'C') --完全刷新
二. 實例演示:
以下是我通過創(chuàng)建物化視圖,實現(xiàn)不同數(shù)據(jù)庫間表級別的數(shù)據(jù)同步的一個過程記錄蒿涎,(兩臺服務器A和B哀托,其中要把數(shù)據(jù)從A節(jié)點的表zh_major_item同步到B節(jié)點上)。目前實現(xiàn)同步的過程還只是一個單向的過程劳秋,也就是從A節(jié)點 ---> B節(jié)點:
主要步驟:
- 在A節(jié)點創(chuàng)建原表和物化視圖日志
- 在B節(jié)點創(chuàng)建連接A節(jié)點的遠程鏈接
- 在B節(jié)點處,創(chuàng)建目標表和與目標表名稱相同的物化視圖
1. 在A節(jié)點創(chuàng)建原表和物化視圖日志:
--在源A處 創(chuàng)建物化視圖日志
sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl
--原表zh_major_item之前已經存在仓手,這里就不贅述表創(chuàng)建的過程了
--創(chuàng)建物化視圖日志
create materialized view log on zh_major_item;
2. 在B節(jié)點創(chuàng)建連接A節(jié)點的遠程鏈接:
--在目標B處 創(chuàng)建遠程連接
--如果沒有創(chuàng)建遠程連接的權限,需要登錄sysdba,為用戶授權;
--之所以跟上面一樣,因為我的用戶名和密碼相同而已
sqlplus tianzhi_smart/tianzhi_smart@localhost:1521/orcl
--創(chuàng)建遠程連接 db_link
create public database link db_link_A
connect to tianzhi_smart
identified by "tianzhi_smart"
using '192.168.56.6:1521/ORCL';
--驗證是否創(chuàng)建成功
select * from zh_major_item@db_link_A ;
3. 在B節(jié)點處,創(chuàng)建目標表和與目標表名稱相同的物化視圖:
--B節(jié)點處創(chuàng)建目標表bc_major_item
create table bc_major_item
as select * from zh_major_item@db_link_A where 1=2;
--通過遠程連接向A節(jié)點建立一個與目標表(bc_major_item)名稱相同的物化視圖
--使用on prebuilt table注冊新的物化視圖胖齐,注意view名稱必須和表名稱一樣
--使用on prebuilt table創(chuàng)建的物化視圖被刪除后,原來的表不被刪除
--注意這里我創(chuàng)建是refresh fast on demand 類型的物化視圖
create materialized view bc_major_item
on prebuilt table refresh fast on demand
as select * from zh_major_item@db_link_A ;
4.在B節(jié)點處嗽冒,刷新物化視圖
--刷新物化視圖
exec dbms_mview.refresh('bc_major_item ','C');
--刷新后,查詢目標表,比對是否和原表數(shù)據(jù)相同
select * from bc_major_item ;
5.升級采用存儲過程+定時任務JOB方式,定時刷新物化視圖
--創(chuàng)建存儲過程呀伙,進行增量刷新
create or replace procedure refresh_bc_major_item
as
begin
dbms_mview.refresh('bc_major_item','F');
end;
/
--創(chuàng)建任務JOB
SQL> variable job1 number;
SQL>begin
dbms_job.submit(:job1,'refresh_bc_major_item;',sysdate,'sysdate+1/(86400)');
end;
/
--運行JOB
SQL> begin
dbms_job.run(:job1);
end;
/
6.進一步優(yōu)化:
可以再寫一個存儲過程+定時任務JOB,定時清空物化視圖日志添坊。
三. 文章更新記錄
v1.0 -- 表面是實現(xiàn)了同步剿另,其實查詢的只是視圖,并沒有完成如題目所指的問題
v2.0 -- 將目標表和物化視圖建立聯(lián)系帅腌,真正實現(xiàn)數(shù)據(jù)同步驰弄。2016.12.6