ORACLE物化視圖-看這一篇就可以了,看完全懂

快速:


一、物化視圖的創建

create materialized view [view_name] 
refresh [fast|complete|force] 

on [commit|demand] | 
start with (start_time) next (next_time) 

as 
{創建物化視圖用的查詢語句} 

具體實例如下: 

CREATE MATERIALIZED VIEW an_user_base_file_no_charge 
             REFRESH COMPLETE START WITH SYSDATE 
            NEXT TRUNC(SYSDATE+29)+5.5/24    --紅色部分表示從指定的時間開始,每隔一段時間(由next指定)就刷新一次 
AS 
select distinct user_no 
from cw_arrearage t 
where (t.mon = dbms_tianjin.getLastMonth or 
       t.mon = add_months(dbms_tianjin.getLastMonth, -1)) 
刪除物化視圖: 
drop materialized view an_user_base_file_no_charge; 

以上是Oracle創建物化視圖(Materialized View,以下簡稱MV)時的常用語法,各參數的含義如下: 

1.refresh [fast|complete|force] 視圖刷新的方式: 
fast: 增量刷新.假設前一次刷新的時間爲t1,那麼使用fast模式刷新物化視圖時,只向視圖中添加t1到當前時間段內,主表變化過的數據.爲了記錄這種變化,建立增量刷新物化視圖還需要一個物化視圖日誌表。create materialized view log on (主表名)。 
complete:全部刷新。相當於重新執行一次創建視圖的查詢語句。 
force: 這是默認的數據刷新方式。當可以使用fast模式時,數據刷新將採用fast方式;否則使用complete方式。 

2.MV數據刷新的時間: 
on demand:在用戶需要刷新的時候刷新,這裏就要求用戶自己動手去刷新數據了(也可以使用job定時刷新) 
on commit:當主表中有數據提交的時候,立即刷新MV中的數據; 
start ……:從指定的時間開始,每隔一段時間(由next指定)就刷新一次; 

手動刷新物化視圖: 
begin 
     dbms_mview.refresh(TAB=>'an_user_base_file_no_charge', 
                                       METHOD=>'COMPLETE', 
                                       PARALLELISM=>8);   --PARALLELISM並行控制參數 
end; 


增量刷新就不需要使用什麼並行了,通常情況下,是沒有那個必要的。 

begin 
     dbms_mview.refresh(TAB=>'an_user_base_file_no_charge', 
                                       METHOD=>'FAST', 
                                       PARALLELISM=>1); 
end; 



詳解:

一、物化的一般用法物化視圖是一種特殊的物理表,“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表,應用的侷限性大,任何對視圖的查詢,oracle都實際上轉換爲視圖SQL語句的查詢。這樣對整體查詢性能的提高,並沒有實質上的好處。

1、物化視圖的類型ON DEMAND、ON COMMIT。二者的區別在於刷新方法的不同,ON DEMAND顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;而ON COMMIT是說,一旦基表有了COMMIT,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。
物化視圖可以分爲以下三種類型:包含聚集的物化視圖;只包含連接的物化視圖;嵌套物化視圖。三種物化視圖的快速刷新的限制條件有很大區別,而對於其他方面則區別不大。創建物化視圖時可以指定多種選項,下面對幾種主要的選擇進行簡單說明:
創建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED兩種。BUILD IMMEDIATE是在創建物化視圖的時候就生成數據,而BUILD DEFERRED則在創建時不生成數據,以後根據需要在生成數據。默認爲BUILD IMMEDIATE。
查詢重寫(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE兩種。分別指出創建的物化視圖是否支持查詢重寫。查詢重寫是指當對物化視圖的基表進行查詢時,Oracle會自動判斷能否通過查詢物化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的物化視圖中讀取數據。默認爲DISABLE QUERY REWRITE。
在建立物化視圖的時候可以指定ORDER BY語句,使生成的數據按照一定的順序進行保存。不過這個語句不會寫入物化視圖的定義中,而且對以後的刷新也無效。
2、ON DEMAND物化視圖物化視圖的創建本身是很複雜和需要優化參數設置的,特別是針對大型生產數據庫系統而言。但Oracle允許以這種最簡單的,類似於普通視圖的方式來做,所以不可避免的會涉及到默認值問題。也就是說Oracle給物化視圖的重要定義參數的默認值處理是我們需要特別注意的。物化視圖的特點:
(1) 物化視圖在某種意義上說就是一個物理表(而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到佐證;
(2) 物化視圖也是一種段(segment),所以其有自己的物理存儲屬性;
(3) 物化視圖會佔用數據庫磁盤空間,這點從user_segment的查詢結果,可以得到佐證;
創建語句:
SQL> create materialized view mv_name as select * from table_name;
默認情況下,如果沒指定刷新方法和刷新模式,則Oracle默認爲FORCE和DEMAND。
物化視圖的數據怎麼隨着基表而更新?
Oracle提供了兩種方式,手工刷新和自動刷新,默認爲手工刷新。也就是說,通過我們手工的執行某個Oracle提供的系統級存儲過程或包,來保證物化視圖與基表數據一致性。這是最基本的刷新辦法了。自動刷新,其實也就是Oracle會建立一個job,通過這個job來調用相同的存儲過程或包,加以實現。
ON DEMAND物化視圖的特性及其和ON COMMIT物化視圖的區別,即前者不刷新(手工或自動)就不更新物化視圖,而後者不刷新也會更新物化視圖,——只要基表發生了COMMIT。
創建定時刷新的物化視圖(指定物化視圖每天刷新一次):
SQL> create materialized view mv_name refresh force on demand start with sysdate next sysdate+1;
上述創建的物化視圖每天刷新,但是沒有指定刷新時間,如果要指定刷新時間(比如每天晚上10:00定時刷新一次):
SQL> create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');
3、ON COMMIT物化視圖ON COMMIT物化視圖的創建,和上面創建ON DEMAND的物化視圖區別不大。因爲ON DEMAND是默認的,所以ON COMMIT物化視圖,需要再增加個參數即可。
需要注意的是,無法在定義時僅指定ON COMMIT,還得附帶個參數才行。創建ON COMMIT物化視圖:
SQL> create materialized view mv_name refresh force on commit as select * from table_name;
備註:實際創建過程中,基表需要有主鍵約束,否則會報錯(ORA-12014)。
4、物化視圖的刷新刷新(Refresh):指當基表發生了DML操作後,物化視圖何時採用哪種方式和基表進行同步。
刷新的模式有兩種:ON DEMAND和ON COMMIT。
刷新的方法有四種:FAST、COMPLETE、FORCE和NEVER。FAST刷新採用增量刷新,只刷新自上次刷新以後進行的修改。COMPLETE刷新對整個物化視圖進行完全的刷新。如果選擇FORCE方式,則Oracle在刷新時會去判斷是否可以進行快速刷新,如果可以則採用FAST方式,否則採用COMPLETE的方式。NEVER指物化視圖不進行任何刷新。
對於已經創建好的物化視圖,可以修改其刷新方式,比如把物化視圖mv_name的刷新方式修改爲每天晚上10點刷新一次:
SQL> alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');
5、物化視圖日誌如果需要進行快速刷新,則需要建立物化視圖日誌。物化視圖日誌根據不同物化視圖的快速刷新的需要,可以建立爲ROWID或PRIMARY KEY類型的。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
可以指明ON PREBUILD TABLE語句將物化視圖建立在一個已經存在的表上。這種情況下,物化視圖和表必須同名。當刪除物化視圖時,不會刪除同名的表。這種物化視圖的查詢重寫要求參數QUERY_REWRITE_INTEGERITY必須設置爲trusted或者stale_tolerated。
6、物化視圖分區而且基於分區的物化視圖可以支持分區變化跟蹤(PCT)。具有這種特性的物化視圖,當基表進行了分區維護操作後,仍然可以進行快速刷新操作。對於聚集物化視圖,可以在GROUP BY列表中使用CUBE或ROLLUP,來建立不同等級的聚集物化視圖。
二、物化視圖與數據遷移Oracle 的物化視圖提供了強大的功能,可以用於預先計算並保存表連接或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,而從快速的得到結果。物化視圖有很多方面和索引很相似:使用物化視圖的目的是爲了提高查詢性能;物化視圖對應用透明,增加和刪除物化視圖不會影響應用程序中SQL 語句的正確性和有效性;物化視圖需要佔用存儲空間;當基表發生變化時,物化視圖也應當刷新。
如如何建立在特定的表空間上,這些在其他的物化視圖上面幾乎都沒有任何介紹的。主要以我做的一個例子來操作,如果對物化視圖的基本概念清楚了就比較明白在那裏寫特定的表空間存儲了。



5、刪除物化視圖日誌物化視圖日誌經常會由於物化視圖長時間沒有刷新,或者基表的一次批量數據更改而變得很大,這會影響物化視圖的刷新性能,因此對於這種情況需要對物化視圖日誌進行處理,降低物化視圖日誌表的高水位線。
物化視圖日誌會記錄下基表所有的增、刪、改操作,而物化視圖執行完快速刷新操作後,會從物化視圖日誌中將本物化視圖刷新過且其他物化視圖所不需要刷新的記錄刪除掉。如果其中一個物化視圖一直不刷新,那麼物化視圖日誌就會變得越來越大。
還有一種情況,比如表中插入了大量的數據,或者刪除了大量的數據,或者將表中的某一列統一更新爲一個值,這種操作都會在物化視圖日誌中產生大量的記錄。
而物化視圖日誌的增大必然影響物化視圖的刷新速度。一方面,物化視圖在刷新的時候要掃描物化視圖日誌,另一方面,物化視圖在刷新介紹後,也要清除物化視圖日誌中的記錄,仍然要掃描物化視圖日誌,因此物化視圖日誌的大小直接會影響物化視圖快速刷新的速度。更重要的是,物化視圖日誌的高水位一旦增長到一個很高的位置,即使以後物化視圖日誌中記錄很少,甚至沒有記錄存在,物化視圖在刷新的時候仍然需要較長的時間。
SQL> DROP materialized view log on mv_lvy_levytaxbgtp; 
SQL> DROP materialized view log on tb_lvy_levydetaildata; 
SQL> DROP materialized view log on tb_lvy_levydata; 
6、刪除物化視圖SQL> drop materialized view MV_LVY_LEVYDETAILDATA; 
基本和對錶的操作一致,物化視圖由於是物理真實存在的,故可以創建索引,創建方式和對普通表創建方式相同。
三、ORACLE物化視圖總結物化視圖是包括一個查詢結果的數據庫對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的彙總表。物化視圖存儲基於遠程表的數據,也可以稱爲快照。物化視圖可以查詢表,視圖和其它的物化視圖。主要用在數據倉庫和決策支持系統。
通常情況下,物化視圖被稱爲主表(在複製期間)或明細表(在數據倉庫中)。對於複製,物化視圖允許你在本地維護遠程數據的副本,這些副本是隻讀的。如果你想修改本地副本,必須用高級複製的功能。當你想從一個表或視圖中抽取數據時,你可以用從物化視圖中抽取。對於數據倉庫,創建的物化視圖通常情況下是聚合視圖,單一表聚合視圖和連接視圖。
物化視圖把他的物理結構存儲在自己的段中,該段可以被索引和分區。查詢不必完全匹配用來創建物化視圖的SQL語句,優化程序可以動態重寫一個與原定義相近的查詢,以便物化視圖用來代替實際的表,這種查詢重寫自動發生,對用戶是透明的。
1、使用物化視圖前的幾個配置步驟(1) 確定那些語句要創建物化視圖。
(2) 決定是否要保持視圖與基礎表數據同步。
如果不同步,可選擇如下三種刷新方式:
COMPLETE:刷新啓動時,先truncate物化視圖,再從基礎表重新插入填充數據。
FAST:只刷新基礎表上次刷新後改變的數據。使用視圖的日誌數據或ROWID完成。
FORCE:默認的方式。先使用FAST,不行就使用COMPLETE方式。
(3) 設置init.ora的參數:
JOB_QUEUE_PROCESSES,必須設置大於 1。
QUERY_REWRITE_ENABLED,設置爲TRUE時,允許動態重寫查詢。
QUERY_REWRITE_INTEGRITY,確定訪問物化視圖時數據一致性要遵守的程度。
OPTIMIZER_MODE,必須設置成CBO的某種方式。
使用一個物化視圖,用戶只需在基礎表上擁有權限即可。
2、創建物化視圖SQL>create materialized view emp_by_district
Tablespace mview_data
Build immediate
Refresh fast
Enable query rewrite
As 
Select d.id,count(e.last_name) from distributor dist,district d,employee e
Where e.id = dist.manager_id
And d.id dist.district_id
Group by d.id;
以下是Oracle創建物化視圖時的常用語法,各參數的含義如下:
1、refresh [fast|complete|force] 視圖刷新的方式
fast: 增量刷新.假設前一次刷新的時間爲t1,那麼使用fast模式刷新物化視圖時,只向視圖中添加t1到當前時間段內,主表變化過的數據.爲了記錄這種變化,建立增量刷新物化視圖還需要一個物化視圖日誌表。create materialized view log on (主表名)。
complete:全部刷新。相當於重新執行一次創建視圖的查詢語句。
force: 這是默認的數據刷新方式。當可以使用fast模式時,數據刷新將採用fast方式;否則使用complete方式。
2、MV數據刷新的時間
on demand:在用戶需要刷新的時候刷新,這裏就要求用戶自己動手去刷新數據了(也可以使用job定時刷新)
on commit:當主表中有數據提交的時候,立即刷新MV中的數據;
start ……:從指定的時間開始,每隔一段時間(由next指定)就刷新一次;
3、Build immediate一共有三個選項
(1) Build immediate:建立物化視圖,並使用當前命令執行的數據馬上填充視圖數據。
(2) Build deferred:只建立物化視圖,在第一次刷新之間不填充數據。
(3) No prebuilt table,使用事先已存在的,已含有視圖定義中有現有數據的表,而不是建立一個新結構來保存數據。
如果是refresh fast on commit或refresh complete on commit創建的,則在基礎表提交的時候都會得到刷新。啓用或禁用物化視圖,需要有query rewrite或global query rewrite權限。
3、刷新物化視圖自動刷新:
(1) 使用commit選項。
(2) 使用dbms_mview安排自動刷新時間。
手工刷新:
SQL>execute dbms_mview.refresh(‘EMP_BY_DISTRICT’); --刷新指定的物化視圖
SQL>execute dbms_mview.refresh_defresh_dependent(‘EMPLOYEE’); ――刷新利用了該表的所有物化視圖
SQL>execute dbms_mview.refresh_all_mviews; ――刷新該模式中,自上次刷新以來,未得到刷新的所有物化視圖。
4、禁用物化視圖- 修改init.ora參數的query_rewrite_enabled參數設置成flase,重啓實例。
- 使用alter system set query_rewrite_enabled = flase;動態修改。
- 使用alter session set query_rewrite_enabled = flash;修改會話內。
- 使用 norewrite提示。
5、刪除物化視圖SQL>drop materialized view emp_by_district;
發佈了386 篇原創文章 · 獲贊 388 · 訪問量 128萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章