最近幾天,我負責的P項目環境中提供給W系統的一個視圖,由於查詢邏輯復雜,數據量比較大,導致每次查詢視圖的時候,查詢速度慢,效率低下,遭到了w系統人員的投訴。想了想,還是改成物化視圖吧,用了物化視圖,腰不酸,腿不痛,查詢快了,投訴少了,誰用誰知道,呵呵。
真要詳細陳述物化視圖的相關內容,篇幅過大,所以此處僅記錄了我自己在這次調整中所做的操作。創建最簡單的物化視圖,不使用快速刷新,所以此處不創建物化視圖日志。
創建物化視圖語句如下(因為數據問題,此處更改了查詢內容):
CREATE MATERIALIZED VIEW MV_TableName BUILD IMMEDIATE --創建時立即刷新 REFRESH FORCE --如果可以快速刷新則進行快速刷新,否則完全刷新 ON DEMAND --刷新方式 START WITH SYSDATE --第一次刷新時間 NEXT SYSDATE+1/12 --刷新時間間隔 AS SELECT 1 id ‘A’ name FROM dual;
我自己在PLSQL中執行的時候,有時會因為注釋的原因,導致物化視圖創建失敗,所以,創建時還是刪去注釋吧。
如果某些情況想要修改刷新頻率,可以使用以下命令修改刷新間隔
ALTER MATERIALIZED VIEW MV_TableName REFRESH FORCE ON DEMAND START WITH SYSDATE NEXT SYSDATE+1/144;
查詢物化視圖上次刷新時間
SELECT last_refresh_date FROM user_mviews WHERE mview_name = 'MV_TABLENAME';
手動刷新物化視圖
BEGIN dbms_mview.refresh('MV_TABLENAME'); END;
刪除物化視圖的話,可以使用如下語句
DROP MATERIALIZED VIEW MV_TableName;
不能的,你的基表要是實體表的,雖然物化視圖說和實際的表一樣的功能,提高查詢速度,不過還是有本質區別的,如果是想這樣做的話,你可以創建多份物化視圖的,對於同一個表,或是在建立的物化視圖A上創建觸發器,自己生成日志,寫個存儲過程加上job進行數據同步一樣的。不過建議你,還是用第一種,簡單點。
exec dbms_mvview.refresh('MV_NAME');