DB2 物化查詢表MQT

各數據庫都有對應的物化視圖來將查詢的結果緩存於內存之中,顯著地提高了查詢的效率。而在DB2中,物化查詢表MQT (Materialized Query Tables)就起到其他數據庫中物化視圖的作用。

數據庫的視圖和MQT都是基於一個查詢來定義的。每當視圖被引用時,視圖所基於的查詢便會運行。但MQT實際上會將查詢結果存儲爲數據,您可以使用MQT中的這些數據,而不是使用底層表中的數據。

雖然物化查詢表極大地提高了查詢的效率,但維護物化查詢表也是相當耗時的。所以,物化查詢表廣泛應用在數據倉庫和海量數量的報表查詢中,這類查詢的特點是:數據量大、經常需要分組統計、數據不會頻繁變更。正因爲這些特點,在這些場合中物化查詢表可以充分發揮它的優勢。

在定義物化查詢表時,我們可以指定在原始表數據改變時,是立即刷新物化查詢表(REFRESH IMMEDIATE),還是延遲刷新(REFRESH DEFERRED );還可以指定,物化查詢表是由系統維護(MAINTAINED BY SYSTEM),還是由用戶維護(MAINTAINED BY USER)。

1、立即刷新的MQT

CREATE TABLE COMMON.T_BAS_NODE_ACCE_USER_MQT (USER_ID,USER_NAME) 
AS ( select  USER_ID,USER_NAME from COMMON.T_BAS_NODE_ACCE_USER ) 
DATA INITIALLY DEFERRED REFRESH IMMEDIATE MAINTAINED BY SYSTEM;

SET INTEGRITY FOR COMMON.T_BAS_NODE_ACCE_USER_MQT IMMEDIATE CHECKED FULL ACCESS;

當基表COMMON.T_BAS_NODE_ACCE_USER 數據發生變化時,物化視圖表的數據同時進行改變。

2、延遲刷新的MQT

 CREATE TABLE COMMON.T_BAS_NODE_ACCE_USER_MQT (USER_ID,USER_NAME) 
AS ( select ACCEUSER.USER_ID, ACCEUSER.USER_NAME from COMMON.T_BAS_NODE_ACCE_USER 
ACCEUSER INNER JOIN COMMON.T_BAS_FLOW_INS FIN ON ACCEUSER.T_BAS_FLOW_INS_ID = FIN.T_BAS_FLOW_INS_ID ) 
DATA INITIALLY DEFERRED REFRESH DEFERRED maintained by user  ;

SET INTEGRITY FOR COMMON.T_BAS_NODE_ACCE_USER_MQT materialized query immediate unchecked;

當關聯基表的數據發生變化時,物化視圖表的數據無法立即同步,必須先刷新物化視圖表,數據才能準確。

refresh table COMMON.T_BAS_NODE_ACCE_USER_MQT;

但在實際使用過程中,不可能每次都刷新MQT之後,在查詢數據。通過創建觸發器達到基表數據更新時,對MQT進行刷新。

CREATE TRIGGER COMMON.T_BAS_NODE_ACCE_USER_TRIGGER
AFTER INSERT 
ON COMMON.T_BAS_NODE_ACCE_USER
FOR EACH STATEMENT 
BEGIN 
   DECLARE param VARCHAR(1000);
  
   SET param = 'refresh table COMMON.T_BAS_NODE_ACCE_USER_MQT';
   PREPARE s1 FROM param;
   EXECUTE s1 ;

END;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章