物化查詢表(MQT)預計算涉及一或多個表/別名的查詢結果。後續查詢通過全量或部分匹配 MQT,由 DB2 補償剩餘邏輯,大幅提升查詢性能。MQT 對應用完全透明,創建刪除無需修改代碼,類似索引機制。透明性由 SQL 編譯器的 MQT 匹配算法實現:重寫階段啟發式選擇最優匹配方案,優化階段計算成本選擇最終執行計劃。注意:MQT 非越多越好,會增加存儲佔用與編譯時間,需針對性創建。
基於「MQT 包含查詢所需所有行、列,冗余度一致或可補償」原理,以下六類查詢可利用 MQT:
維表 Product(PROD_ID 唯一鍵)、Customer(CUST_ID 唯一鍵),事實表 Sales(外鍵關聯兩維表,保證 RI)。Product 定義函數依賴:CAT_ID → CAT_DESC、CAT_ID → GROUP_ID(NOT ENFORCED ENABLE QUERY OPTIMIZATION)。人為設置統計信息使編譯器傾向選擇 MQT 方案。
CREATE TABLE MQTSCH.PRODUCT(PROD_ID INT NOT NULL UNIQUE,
PROD_DESC VARCHAR(64), CAT_ID INT NOT NULL, CAT_DESC VARCHAR(64),
GROUP_ID INT NOT NULL, GROUP_DESC VARCHAR(64),
CONSTRAINT FD1 CHECK (CAT_DESC DETERMINED BY CAT_ID) NOT ENFORCED ENABLE QUERY OPTIMIZATION,
CONSTRAINT FD2 CHECK (GROUP_ID DETERMINED BY CAT_ID) NOT ENFORCED ENABLE QUERY OPTIMIZATION);
CREATE TABLE MQTSCH.CUSTOMER(CUST_ID INT NOT NULL UNIQUE, CUST_NAME VARCHAR(50), CUST_ADDRESS VARCHAR(100));
CREATE TABLE MQTSCH.SALES(PROD_ID INT NOT NULL REFERENCES MQTSCH.PRODUCT(PROD_ID),
CUST_ID INT NOT NULL REFERENCES MQTSCH.CUSTOMER(CUST_ID),
SALE_DATE DATE NOT NULL, AMOUNT DECIMAL(9,2) NOT NULL);
set current refresh age=any;
MQT SALES_PROD 基於外鍵連接 Sales 與 Product,查詢相同 Join。執行計劃顯示 TBSCAN 直接訪問 MQT,診斷信息確認 MQT 被利用。
查詢在精確匹配基礎上增加謂詞 AMOUNT > 10000。TBSCAN 包含謂詞過濾,MQT 被重用,僅需額外計算剩餘條件。
MQT 連接 Sales+Product,查詢額外連接 Customer。前提:MQT 結果集為查詢對應連接結果的超集(MQT 無額外過濾謂詞)。執行計劃顯示 NLJOIN 將 MQT 與 Customer 重新連接。
MQT SALES_PROD_CUST 連接三表,查詢僅連接 Sales+Product。額外 Join 基於 RI(外鍵),不增減行數,編譯器利用此特性匹配 MQT。執行計劃直接 TBSCAN 訪問 MQT。
MQT SALES_BY_CAT 包含 CAT_ID、SUM(AMOUNT),查詢需 CAT_DESC。Product 定義 FD:CAT_ID → CAT_DESC。編譯器先判定 MQT 不合格(EXP0073W),收集 FD 後重寫查詢,通過 MQT 與 Product 重新連接(DISTINCT 去重)獲取 CAT_DESC,最終匹配成功(EXP0149W)。
MQT 粒度細於查詢時,可通過進一步聚合滿足查詢(本文未展開示例)。
針對性創建 MQT 覆蓋高頻查詢模式;利用 RI 與函數依賴擴大匹配範圍;監控編譯時間避免過度創建;結合 EXPLAIN 診斷信息驗證匹配效果。