物化查詢表 (MQT) 以預先計算結果加速複雜查詢,廣泛應用於數據倉庫。然而,刷新策略直接決定資料鮮度與系統負載的平衡點。DB2 提供 REFRESH IMMEDIATE(即時增量)、REFRESH DEFERRED(手動全量)、REFRESH DEFERRED + Staging Table(手動增量)三種模式。本文利用 db2exfmt 格式化 Explain 輸出,從訪問計劃層面剖析各模式運作細節,助您依業務場景精準選型。
db2 -tvf ~/sqllib/misc/EXPLAIN.DDLdb2 set current explain mode explaindb2exfmt -d MYDB -1 -e -o <file>.exfmtCREATE TABLE basetable (c1 INT NOT NULL PRIMARY KEY, c2 INT, c3 INT, c4 INT);
INSERT INTO basetable VALUES (1,1,1,1),(2,2,2,2),(3,3,3,3),(11,11,11,11);
CREATE TABLE mqttab AS (SELECT c1,c2,c3 FROM basetable WHERE c1 > 10)
DATA INITIALLY DEFERRED REFRESH IMMEDIATE;
SET INTEGRITY FOR mqttab IMMEDIATE CHECKED NOT INCREMENTAL;
db2 "INSERT INTO basetable VALUES(12,12,12,12)"
計劃關鍵點:
Estimated number of rows: 1 確認為增量刷新
註:Explain 模式下不實際寫入,故查詢 MQT 不會看到新資料。
計劃結構與 INSERT 同構:基表操作算子 + 對應 MQT 維護算子(UPDATE/DELETE),同樣為增量處理。完整計劃請參考下載檔 update1.exfmt、delete1.exfmt。
db2 "REFRESH TABLE mqttab"
計劃極簡:僅含 TBSCAN → GENROW,無任何對 MQT 的實際操作。因即時模式下資料已同步,手動刷新為空操作。

CREATE TABLE basetab2 (c1 INT NOT NULL PRIMARY KEY, c2 INT, c3 INT, c4 INT);
INSERT INTO basetab2 VALUES (1,1,1,1),(2,2,2,2),(3,3,3,3),(11,11,11,11);
CREATE TABLE mqttab2 AS (SELECT c1,c2,c3 FROM basetab2 WHERE c1 > 10)
DATA INITIALLY DEFERRED REFRESH DEFERRED;
SET INTEGRITY FOR mqttab2 IMMEDIATE CHECKED NOT INCREMENTAL;
INSERT/UPDATE/DELETE 計劃均僅含基表操作,完全無 MQT 相關算子,驗證「延遲刷新不即時維護」特性。

INSERT INTO basetab2 VALUES (12,12,12,12),(13,12,12,12),(14,12,12,12),(15,12,12,12);
UPDATE basetab2 SET c2=100 WHERE c1=11;
RUNSTATS ON TABLE hqy.basetab2;
db2 "REFRESH TABLE mqttab2"
計劃特徵:
FETCH → TBSCAN basetab2(全表掃描基表並過濾)TBSCAN mqttab2(掃描舊 MQT 找出失效行)
CREATE TABLE basetab3 (c1 INT NOT NULL PRIMARY KEY, c2 INT, c3 INT, c4 INT);
INSERT INTO basetab3 VALUES (1,1,1,1),(2,2,2,2),(3,3,3,3),(11,11,11,11);
CREATE TABLE mqttab3 AS (SELECT c1,c2,c3 FROM basetab3 WHERE c1 > 10)
DATA INITIALLY DEFERRED REFRESH DEFERRED;
CREATE TABLE mqttab3_stg FOR mqttab3 PROPAGATE IMMEDIATE;
SET INTEGRITY FOR mqttab3 MATERIALIZED QUERY IMMEDIATE UNCHECKED;
SET INTEGRITY FOR mqttab3_stg STAGING IMMEDIATE UNCHECKED;
Staging 表結構自動包含 MQT 全欄位 + GLOBALTRANSID、GLOBALTRANSTIME、OPERATIONTYPE 三個控制欄,完整捕獲基表變更。

INSERT/UPDATE/DELETE 計劃與即時模式幾乎相同,差別僅在:
MQTTAB3_STG)
INSERT INTO basetab3 VALUES (12,12,12,12),(13,12,12,12),(14,12,12,12),(15,12,12,12);
UPDATE basetab3 SET c2=100 WHERE c1=11;
RUNSTATS ON TABLE hqy.basetab3;
db2 "REFRESH TABLE mqttab3"
計劃極度複雜(見 refresh3.exfmt),核心邏輯:

| 維度 | IMMEDIATE | DEFERRED (無 Staging) | DEFERRED + Staging |
|---|---|---|---|
| 刷新觸發 | 基表 DML 自動 | 手動 REFRESH | 手動 REFRESH |
| 刷新粒度 | 增量 (逐列) | 全量 (重建) | 增量 (經 Staging) |
| 基表 DML 開銷 | 高 (同步維護 MQT) | 無 (僅基表) | 中 (同步維護 Staging) |
| 手動刷新開銷 | 極低 (空操作) | 高 (全掃基表+MQT) | 中 (掃 Staging + 合併) |
| 資料鮮度 | 實時 | 刷新時刻 | 刷新時刻 |
| 適用場景 | 低延遲需求、寫入量可控 | 唯讀為主、維護窗口固定 | 大表增量刷新、平衡鮮度與負載 |
通過 Explain 計劃對比,我們清晰看到三種機制的本質差異。實際選型時請綜合考量:
進階探索方向:含聚合函數的 MQT 刷新計劃、LOAD 操作對各模式的影響、多維度 MQT 的 Staging 表設計優化。