Materialized Query Table (MQT) 以查詢結果為基礎定義的表,物理存儲數據。分類:
REFRESH IMMEDIATE:事務提交時同步更新,要求底層表有唯一鍵,查詢無外連接/聚合限制。REFRESH DEFERRED:手動 REFRESH TABLE 更新,查詢語法無限制。REFRESH DEFERRED + MAINTAINED BY USER,應用負責 ETL 同步,DB2 不驗證一致性,查詢重寫需 CURRENT REFRESH AGE=ANY。CONNECT TO SAMPLE;
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO);
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO);
CREATE TABLE EMP AS (
SELECT E.EMPNO, E.FIRSTNME, E.LASTNAME, E.PHONENO,
D.DEPTNO, SUBSTR(D.DEPTNAME,1,12) AS DEPARTMENT, D.MGRNO
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.WORKDEPT = D.DEPTNO
)
DATA INITIALLY DEFERRED
REFRESH IMMEDIATE;
SET INTEGRITY FOR EMP IMMEDIATE CHECKED NOT INCREMENTAL;
SELECT * FROM EMP; -- 驗證數據已填充
| 子句 | 含義 |
|---|---|
| DATA INITIALLY DEFERRED | 創建時不填充數據,進入 Check Pending 狀態 |
| REFRESH IMMEDIATE | 事務級同步更新 |
| SET INTEGRITY ... IMMEDIATE CHECKED | 按定義查詢檢查並刷新數據,退出 Check Pending |
| NOT INCREMENTAL | 全表完整性檢查 (首次/重建時必須) |
GROUP BY 聚合的特殊 MQT,適用報表預聚合。REFRESH DEFERRED MQT 的增量刷新,避免全量重算。創建:CREATE STAGING TABLE FOR mqt_name。-- 原始查詢
SELECT WORKDEPT, COUNT(*) FROM EMPLOYEE GROUP BY WORKDEPT;
-- 啟用重寫
SET CURRENT REFRESH AGE = ANY;
SET CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION = ALL;
-- 再次執行,EXPLAIN 顯示訪問 EMP MQT 而非 EMPLOYEE/DEPARTMENT
REFRESH TABLE,適合數據倉庫日報表。SYSCAT.TABLES.REFRESH_TIME 確認刷新時效性。SET CURRENT DEGREE = ANY 或 DB2_WORKLOAD=ANALYTICS。