什麼是 MQT?
MQT 依查詢結果定義,可視為物化視圖:數據來自一或多個基表,但視圖每次引用時即時查詢生成,而 MQT 數據定期 (受控) 或指定時間點查詢生成並儲存於 MQT 內部。MQT 可建索引、Runstats 收集統計資訊。
MQT 適用查詢模式
顯著改善執行以下操作的複雜查詢回應:
- 一或多維度聚合數據
- 結合或聚合一組表
- 重複計算
- 資源密集型掃描
- 存取「熱」垂直/水平分區的公共子集
- 分區資料庫環境下從表或表部分檢索
DB2 優化器在查詢重寫階段匹配查詢與現有 MQT,決定是否替換基表存取 (Explain 工具可顯示所選 MQT)。基表越大,潛在改善空間越大 (MQT 增長慢於基表)。
建立 MQT:兩種類型
CREATE TABLE TableName AS (SELECTStatement) DATA INITIALLY DEFERRED REFRESH [IMMEDIATE | DEFERRED]
- 系統維護 MQT:不可 INSERT/UPDATE/DELETE。REFRESH IMMEDIATE 隨基表變更級聯更新;REFRESH DEFERRED 需手動 REFRESH TABLE。
- 用戶維護 MQT:允許 INSERT/UPDATE/DELETE、IMPORT/LOAD 填充。不可用 REFRESH TABLE、不可指定 REFRESH IMMEDIATE。本質為 DBA 填充的摘要表,但優化器可用於改善查詢。可指定 DISABLE QUERY OPTIMIZATION 禁止優化器使用。
MQT CREATE TABLE 語法結構
何時建立 MQT?Design Advisor 來幫忙
提供最新統計資訊、快照監控資訊、具體查詢/工作負載,Design Advisor 推薦索引、MQT、MDC 表,並輸出 DDL 至 ADVISE_INDEX 表。
進階用法:MQT 優化子域存取 (常被忽略)
決策支援/倉庫環境常含一組小而頻繁執行的查詢子謂語/限定符。MQT 不存聚合數據,而是幫助優化器快速識別/隔離符合條件的行,對複雜查詢預先限定行集。
案例:昨日數據子域
- 三報表共用
WHERE DATE = YESTERDAY:總銷售、分區域銷售、分產品銷售。
- 建三個獨立 MQT 佔大量磁碟;改建單一 MQT 界定昨日域,含 Region、Product_ID 等不變屬性,上建適當索引。
- 所有關於昨日的查詢均由該 MQT 滿足,JOIN 與行提取操作面對的數據子集小得多。
核心策略
- 尋找查詢共同模式,識別其表達的域。
- 確定最常用、最能縮減數據量的屬性。
- 建立適當 MQT,基表與 MQT 建索引,及時更新統計。
- 讓優化器自動選擇基表或 MQT,SQL 中勿顯式引用 MQT。
MQT 子域優化架構示意