各數據庫都有對應的物化視圖來將查詢的結果緩存於內存之中,顯著地提高了查詢的效率。而在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;