oracle 物化視圖學習

最近學習了一下物化視圖,正好經理不在,把學習結果貼出來供大家一起研究一下吧。 
先看一下物化視圖的大概含義吧,感覺baidu的定義還不錯 
Baidu代碼  收藏代碼
物化視圖,它是用於預先計算並保存表連接或聚集等耗時較多的操作的結果,這樣,在執行查詢時,就可以避免進行這些耗時的操作,從而快速的得到結果。物化視圖有很多方面和索引很相似:使用物化視圖的目的是爲了提高查詢性能;物化視圖對應用透明,增加和刪除物化視圖不會影響應用程序中SQL 語句的正確性和有效性;物化視圖需要佔用存儲空間;當基表發生變化時,物化視圖也應當刷新。   其中物化視圖有三種:聚集物化視圖、包含連接物化視圖、嵌套物化視圖。但三種物化視圖的快速刷新的限制條件有很大區別,而其他方面則區別不大。  
http://baike.baidu.com/view/3208435.htm  




我的理解就是把表中的數據存起來的一種視圖,他只是名義上叫做視圖,實際上和普通表的效果差不多,主要是供查詢使用的。目前本人理解應該不可以插入、刪除數據。物化視圖數據可以更新,下面會說到。普通視圖記錄了查詢SQL語句,實際使用時還是從實體表中查詢獲得數據,而物化視圖有自己的存儲空間,減少了對實體表的訪問。




1.如何建立一個物化視圖 
Sql代碼  收藏代碼
--創建   
CREATE MATERIALIZED VIEW MV_VIEW AS {SELECT * FROM}  
--刪除  
DROP MATERIALIZED VIEW MV_VIEW AS {SELECT * FROM}  
--例如  
create materialized view MV_SM_USERINFO  
refresh force on demand  
start with to_date('19-01-2012 11:00:00', 'dd-mm-yyyy hh24:mi:ss') next to_date(concat(to_char(SYSDATE+1,'dd-mm-yyyy'),'11:00:00'),'dd-mm-yyyy hh24:mi:ss')   
as  
select sm_user.pk_user,sm_user.user_name,sm_user.user_code,sm_user.password,sm_user.identity_no,sm_user.memo,  
 sm_org.pk_org,sm_org.org_code,sm_org.org_name  
 from sm_user,sm_org where sm_user.pk_org = sm_org.pk_org  
--這個物化視圖使用了定時更新功能  






2.如何讓一個物化視圖定時更新 
ON DEMAND 手工刷新,自動刷新 
ON COMMIT 基表發生了commit 就會自動更新 
定時更新 
Sql代碼  收藏代碼
--指定物化視圖每天刷新一次  
CREATE MATERIALIZED VIEW MV_VIEW REFRESH FORCE ON DEMAND  
START WITH SYSDATE   
NEXT SYSDATE+1   
AS  
……  
--指定物化視圖每天晚上10:00點刷新一次  
CREATE MATERIALIZED VIEW MV_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  






3.如何給物化視圖設置日誌 
Sql代碼  收藏代碼
--語法  
CREATE MATERIALIZED VIEW LOG ON TABLE_NAME  
WITH SEQUENCE,ROWID  
(NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7  
)INCLUDING NEW VALUES;  
  
--sm_user 建立日誌  
create materialized view log on sm_user with SEQUENCE,ROWID(pk_user,user_name,user_code,password,identity_no);  
--sm_org 建立日誌  
create materialized view log on sm_org with SEQUENCE,ROWID(pk_org,org_code,org_name);  
  
  
查看日誌  
select * from mlog$_sm_org  
select * from mlog$_sm_user  
--查詢日誌  
select * from dba_snapshot_logs    
--查詢物化視圖  
select * from dba_snapshot_logs    
--查詢oracle版本信息  
select * from gv$version;  




4.如何使用JAVA線程定時更新物化視圖 
需要先建立儲存過程更新物化視圖,然後使用java線程調用儲存過程。(目前我的理解) 
Sql代碼  收藏代碼
--存儲過程  
create or replace procedure MV_REFRESH_USERINFO is  
begin  
  dbms_mview.refresh('MV_SM_USERINFO');  
end MV_REFRESH_USERINFO;  
  
--線程調用從存儲過程  
private int count = 0;  
Connection orclcon;  
      
public void run(){  
  if(orclcon==null){  
    JDBCDao jdbc = new JDBCDao();  
    orclcon = jdbc.getMATERVIEWConnection();  
  }  
          
  try {  
    CallableStatement proc = orclcon.prepareCall("{call MV_REFRESH_USERINFO()}");  
    boolean result = proc.execute();  
    count++;  
    System.out.println("call MV_REFRESH_USERINFO() " + result + ";已經運行: " + count);  
  } catch (SQLException e) {  
    e.printStackTrace();  
  }  
          
}  






5.其他資料 
物化視圖創建參數 
(1)BUILD 
BUILD IMMEDIATE 是在創建物化視圖的時候就生成數據 
BUILD DEFERRED 則在創建時不生成數據,以後根據需要再生成數據。 
默認爲BUILD IMMEDIATE。 


(2)REFRESH 
FAST 增量刷新用物化視圖日誌,來發送主表已經修改的數據行到物化視圖中。 
COMPLETE 完全刷新重新生成整個視圖,如果請求完全刷新,oracle會完成完全刷新即使增量刷新可用。 
FORCE 如果增量刷新可用Oracle將完成增量刷新,否則將完成完全刷新,如果不指定刷新方法(FAST, COMPLETE, or FORCE)。 
默認選項是Force。 


(3)ON 
ON DEMAND 指物化視圖在用戶需要的時候進行刷新。 
ON COMMIT 指出物化視圖在對基表的DML操作提交的同時進行刷新。 
默認是ON DEMAND. 


(4)START WITH 
通知數據庫完成從主表到本地表第一次複製的時間。 


(5)NEXT 
說明了刷新的時間間隔 
根據下一次刷新的時間=上一次執行完成的時間+時間間隔。 
爲了保證在用戶需要的時間點刷新,一般使用TRUNC()命令對時間取整到天數,然後加上時間。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章