首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 物化查詢表 (MQT) 實戰指南:建立、維護與查詢重寫優化

     編輯:DB2 教學

物化查詢表 (Materialized Query Table, MQT) 以查詢結果定義表結構並實際儲存數據,可大幅提升複雜查詢效能。本文介紹 MQT、摘要表與暫存表概念,並透過實例示範建立與使用系統維護的即時刷新 MQT。

核心概念

  • MQT: 基於查詢結果定義,實際儲存數據。優化器若判斷查詢可由 MQT 解決,會自動重寫查詢使用 MQT。
  • 摘要表 (AST): 特殊 MQT,定義包含 GROUP BY 彙總查詢。
  • 與視圖差異: 視圖每次引用執行查詢;MQT 預先計算儲存結果,查詢直接讀取 MQT。

系統維護 MQT 類型

類型刷新方式可否直接 DML
REFRESH IMMEDIATE底層表異動(INSERT/UPDATE/DELETE)時自動同步不可直接 DML
REFRESH DEFERRED手動執行 REFRESH TABLE 刷新不可直接 DML

建立 REFRESH IMMEDIATE MQT 完整範例

基於 SAMPLE 資料庫的 EMPLOYEE 與 DEPARTMENT 表建立 EMP 表:

CONNECT TO SAMPLE;

-- 前置:被引用表需有唯一鍵出現在 SELECT 清單
ALTER TABLE EMPLOYEE ADD UNIQUE (EMPNO);
ALTER TABLE DEPARTMENT ADD UNIQUE (DEPTNO);

-- 建立 MQT:延遲初始資料、即時刷新
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;

關鍵子句說明:

  • DATA INITIALLY DEFERRED:建表時不載入資料,進入「檢查暫掛」狀態
  • REFRESH IMMEDIATE:系統自動同步底層表變更
  • SET INTEGRITY ... IMMEDIATE CHECKED NOT INCREMENTAL:全表完整性檢查並載入初始資料

進階主題(後續可探索)

  • 使用者維護 MQT: 由應用程式負責刷新,允許直接 DML
  • 暫存表: 輔助 REFRESH DEFERRED MQT 的增量刷新
  • 查詢重寫規則: 優化器匹配 MQT 的條件與限制
  • REFRESH TABLE 增量/全量刷新策略
  • MQT 上建立索引進一步加速查詢

實務建議

  1. 針對高頻、高成本、結果集較小的彙總/連接查詢建立 MQT
  2. 確保底層表有唯一鍵支援 REFRESH IMMEDIATE
  3. 監控 SYSCAT.TABLES 中 REFRESH、CHECK_PENDING 狀態
  4. 大量載入底層表時考慮暫停 MQT 刷新(SET INTEGRITY OFF)載入完再重建
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved