建立物化視圖,提高查詢效率


網站上面的查詢效率已經慢的奇葩。目前能想到的辦法只有物化視圖,提高查詢速率。

物化視圖也是種視圖。 Oracle的物化視圖是包括一個查詢結果的數據庫對像,它是遠程數據的的本地副本,或者用來生成基於數據表求和的匯總表。物化視圖存儲基於遠程表的數據,也可以稱為快照。

物化視圖可以查詢表,視圖和其它的物化視圖。

 

特點:

 

(1) 物化視圖在某種意義上說就是一個 物理表 (而且不僅僅是一個物理表),這通過其可以被user_tables查詢出來,而得到確認;

(2) 物化視圖也是一種段(segment),所以其有自己的物理存儲屬性;

(3) 物化視圖會占用數據庫磁盤空間,這點從user_segment的查詢結果,可以得到佐證;

創建語句:create materialized view mv_name as select * from table_name

因為物化視圖由於是物理真實存在的,故可以創建索引。

 

 

創建時生成數據:

 

分為兩種: build immediate build deferred

build immediate是在 創建物化視圖的時候就生成數據 。

build deferred 則在創建時不生成數據,以后根據需要在生成數據 。

如果不指定,則默認為 build immediate

 

 

 

刷新模式:

 

物化視圖有二種刷新模式:

 

在創建時refresh mode是 on demand 還是 on commit

 

on demand 顧名思義,僅在該物化視圖“需要”被刷新了,才進行刷新(REFRESH),即更新物化視圖,以保證和基表數據的一致性;

 

on commit  提交觸發,一旦基表有了commit,即事務提交,則立刻刷新,立刻更新物化視圖,使得數據和基表一致。一般用這種方法在操作基表時速度會比較慢。

 

創建物化視圖時未作指定,則Oracle按 on demand 模式來創建。

 

 

 

上面說的是 刷新模式 ,針對於如何刷新,則有如下三種 刷新方法 :

 

 

 

完全刷新(COMPLETE): 會刪除表中所有的記錄(如果是單表刷新,可能會采用TRUNCATE的方式),然后根據物化視圖中查詢語句的定義重新生成物化視圖。

 

快速刷新(FAST): 采用增量刷新的機制,只將自上次刷新以后對基表進行的所有操作刷新到物化視圖中去。FAST必須創建基於主表的視圖日志。對於增量刷新選項,如果在子查詢中存在分析函數,則物化視圖不起作用。

 

FORCE方式: 這是默認的數據刷新方式。Oracle會自動判斷是否滿足快速刷新的條件,如果滿足則進行快速刷新,否則進行完全刷新。

 

 

 

關於快速刷新: Oracle物化視圖的 快速刷新 機制是通過 物化視圖日志 完成的。 Oracle通過一個物化視圖日志還可以支持多個物化視圖的快速刷新 。 物化視圖日志根據不同物化視圖的快速刷新的需要,可以建立為ROWID或PRIMARY KEY類型的 。還可以選擇是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

 

 

查詢重寫(QueryRewrite):

 

包括 enable query rewrite disable query rewrite 兩種。

分別指出創建的物化視圖是否支持查詢重寫。 查詢重寫是指當對物化視圖的基表進行查詢時 , oracle會自動判斷能否通過查詢物化視圖來得到結果,如果可以,則避免了聚集或連接操作,而直接從已經計算好的物化視圖中讀取數據。

默認為 disable query rewrite

 

 

語法:

 

create  materialized  view   view_name
refresh  [ fast|complete|force ]
[
on [commit|demand ]   |
start  with  (start_time)  next  (next_time)

 

]

 

AS subquery;

 

閑話少說下面弄具體操作:

創建物化視圖需要的權限:

 

grant   create   materialized   view   to  user_name;  

 

 

 

grant   create   materialized   view   to  creditfw;  

 

在源表建立 物化視圖日志 :

 

create table lhcj(id number, name varchar2(30), num number);

 

create materialized view log on lhcj with rowid, sequence(id, name) including new values;

物化視圖日志已經創建完成。

SQL> desc mlog$_lhcj

ID和NAME是建立物化視圖日志時指定的基表中的列,它們記錄每次DML操作對應的ID和NAME的值。
M_ROW$$保存基表的ROWID信息,根據M_ROW$$中的信息可以定位到發生DML操作的記錄。
SEQUENCE$$根據DML操作發生的順序記錄序列的編號,當刷新時,根據SEQUENCE$$中的順序就可以和基表中的執行順序保持一致。
SNAPTIME$$列記錄了刷新操作的時間。
DMLTYPE$$的記錄值I、U和D,表示操作是INSERT、UPDATE還是DELETE。
OLD_NEW$$表示物化視圖日志中保存的信息是DML操作之前的值(舊值)還是DML操作之后的值(新值)。除了O和N這兩種類型外,對於UPDATE操作,還可能表示為U。
CHANGE_VECTOR$$記錄DML操作發生在那個或那幾個字段上。

在目標數據庫上創建award_punish_view:

 create   materialized   view  award_punish_view  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' )  as

select  *  from  lhjc_view;--lhjc_view為之前查詢用的視圖,查詢太慢,需轉化為物化視圖

 

設置為每天晚10點更新一次數據。

修改刷新時間:

 

 alter   materialized   view  award_punish_view refresh   force   on   demand   start   with   sysdate  

next  to_date( concat (to_char( sysdate + 1 , 'dd-mm-yyyy' ), ' 23:00:00' ), 'dd-mm-yyyy hh24:mi:ss' );

或

alter   materialized   view  award_punish_view refresh   force   on   demand   start   with   sysdate  

next   trunc ( sysdate , 'dd' )+ 1 + 1 / 24 ;  -- 每天1點刷新  

 

 

 

 

刪除物化視圖及日志:

 

 drop   materialized   view   log   on  test_table;     --刪除物化視圖日志: 

drop   materialized   view  mv_materialized_test;  --刪除物化視圖   

 

 

當物化視圖建立好后,肯定要測試一下這個效率如何,這時候,就要用到網站上面查詢語句,進行查詢速率比較咯:

首先是之前的視圖查詢效率時間

 

 

 

 查詢速度為20.972秒。速度極其慢。

 

有壞的,才可以做明顯的比對,現在來看看物化視圖的效率:

 

 

 查詢速度2.5秒,已經快了8倍左右了,速度杠杠的,當然還有更多優化的地方。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM