1. 程式人生 > >oracle物化檢視的簡單應用

oracle物化檢視的簡單應用

根據網上資料以及自身實踐,使用場景:

1:可以用於服務於應用讀寫分離

2:查詢邏輯複雜,資料量比較大,導致每次查詢檢視或表的時候,查詢速度慢,效率低下
操作步驟


一、授權

用system登入oracle,給你需要的使用者user1授予(oracle中的使用者對應表空間)(create any table、create any procedure)許可權:

grant create any table to user1;
grant create any procedure to user1;
二、在目標庫建立 dblink ,指向源資料庫:
先授權:
grant create database link to user1

;

然後建立dblink  連線的服務例項為orcl,指定的源資料庫地址192.168.xxxx.xxxx,源資料庫使用者名稱密碼:source_name/source_pwd,預設埠號1521
create public database link  test_link1 connect to source_name IDENTIFIED BY source_pwd
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.xxxx.xxxx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl

)
)
)';

三、在源資料庫上執行建立物化檢視日誌:需要用普通具體的使用者登入cmd視窗下: sqlplus source_name/source_pwd 或者再oracle管理員使用者下 conn SXGL_FORMA/SXGL_FORMA

CREATE MATERIALIZED VIEW LOG ON 源資料庫某表名 WITH Rowid;
物化檢視的複製預設是基於主鍵的,也可以基於rowid,這裡是create materialized view log on (主表名) with rowid,這樣建立物化檢視就要對應的加上with rowid

如果這一步省略了,會報錯

第 1 行出現錯誤:
ORA-23413: 表 "XXX"."aa" 不帶實體化檢視日誌,或者物化檢視的重新整理機制為complete別用增量更新,

即第四部用這個:

CREATE MATERIALIZED VIEW  MV_物化檢視名字 complete with rowid NEXT  NEXT_DAY(TRUNC(SYSDATE), '星期日')+1/24 AS SELECT * FROM 源資料庫某表名@test_link1;

四、在目標庫上執行:需要用普通具體的使用者登入 sqlplus target_name/target_pwd   每週日凌晨01:00執行從源資料庫中抽取資料
CREATE MATERIALIZED VIEW MV_物化檢視名字 REFRESH FAST with rowid NEXT  NEXT_DAY(TRUNC(SYSDATE), '星期日')+1/24 AS SELECT * FROM 源資料庫某表名@test_link1;

預設是不可更新的,如果建立可以更新的物化檢視得加上for update

CREATE MATERIALIZED VIEW MV_物化檢視名字 REFRESH FAST with rowid NEXT  NEXT_DAY(TRUNC(SYSDATE), '星期日')+1/24  for update   AS SELECT * FROM 源資料庫某表名@test_link1;
-----------------------------------分割線--------------------------------------------------
查詢物化檢視上次重新整理時間

SELECT last_refresh_date 
     FROM user_mviews 
    WHERE mview_name = 'MV_物化檢視名字';

手動重新整理物化檢視

    BEGIN
       dbms_mview.refresh('MV_物化檢視名字');
    END;
    
    
刪除物化檢視的話,可以使用如下語句

DROP MATERIALIZED VIEW MV_物化檢視名字;

刪除實體化檢視日誌

drop materialized view log on table1;  

更多資料詳見: