DB2的物化視圖MQT是基於查詢結果定義的一個表,MQT中包含的數據來自MQT定義所基於的一個或多個表, 使用MQT可以顯著提高查詢的操作性能。
數據庫的視圖和MQT都是基於一個查詢來定義的。每當視圖被引用時,視圖所基於的查詢便會運行。但MQT實際上會將查詢結果存儲為數據,您可以使用MQT中的這些數據,而不是使用底層表中的數據。
MQT 可以顯著提高查詢的性能,尤其是提高復雜查詢的性能。如果優化器確定查詢或查詢的一部分可以用一個 MQT 來解決,那麼查詢就可以被重寫以便利用 MQT。MQT 可以在創建表時定義,可以定義為由系統維護,也可以定義為由用戶維護。
DATA INITIALLY DEFERRED 子句的意思是,在執行 CREATE TABLE 語句的時候,並不將數據插入到表中。
這種 MQT 中的數據是由系統維護的。當創建這種類型的 MQT 時,可以指定表數據是 REFRESH IMMEDIATE 還是 REFRESH DEFERRED。通過 REFRESH 關鍵字可以指定如何維護數據。DEFERRED 的意思是,表中的數據可以在任何時候通過 REFRESH TABLE 語句來刷新。
系統維護的 MQT,不管是 REFRESH DEFERRED 類型的還是 REFRESH IMMEDIATE 類型的,對它們的插入、更新或刪除操作都是不允許的。但是,對於 REFRESH IMMEDIATE 類型的系統維護的 MQT,可以通過 對底層表的更改(即插入、更新或刪除操作)來更新。
下面看一個例子
首先創建原始表
CREATE TABLE T ( ID INTEGER NOT NULL, COL1 VARCHAR(128), COL2 VARCHAR(128), COL3 VARCHAR(128), COL4 VARCHAR(128), COL5 VARCHAR(128), PRIMARY KEY (ID) ) ORGANIZE BY ROW; CREATE TABLE T_MQT ( ID, COL1, COL2, COL3 ) AS ( select ID, COL1, COL2, COL3 from T ) DATA INITIALLY DEFERRED REFRESH IMMEDIATE MAINTAINED BY SYSTEM; SET INTEGRITY FOR T_MQT IMMEDIATE CHECKED FULL ACCESS;
寫入數據到原始表中
insert into T(ID, COL1, COL2, COL3, COL4, COL5) values (1, 'col1', 'col2', 'col3', 'col4', 'col5'); insert into T(ID, COL1, COL2, COL3, COL4, COL5) values (2, 'col1', 'col2', 'col3', 'col4', 'col5'); select * from T; select * from T_MQT;