本文系統梳理 DB2 數據倉庫環境下的六大基石優化策略,涵蓋索引統計維護、多節點並行分區、無日誌批量操作、表級鎖降維、臨時表精簡建模、LEFT JOIN 語義規範,為 DBA 與開發提供統一優化基線。
NONRECOVERABLE 裝載規避。RUNSTATS ON TABLE schema.table AND INDEXES ALL 刷新統計,釋放索引效能。| 模式 | 日誌量 | 可回滾 | 適用場景 |
|---|---|---|---|
| LOGGED (默認) | 全記錄,高爭用 | 是 | OLTP、關鍵業務、需時間點恢復 |
| NOT LOGGED | 極少 (僅元數據) | 否 (失敗只能重建) | ETL 暫存、初始化裝載、可重跑中間表 |
操作: ALTER TABLE ... ACTIVATE NOT LOGGED INITIALLY 或 LOAD ... NONRECOVERABLE。
ALTER TABLE tab LOCKSIZE TABLE。LOCKLIST / MAXLOCKS 參數調優,建立鎖監控告警 (超 70% 告警)。DECLARE GLOBAL TEMPORARY TABLE ... NOT LOGGED。實測:臨時表數據量降 80% + 索引 → 關聯查詢耗時降 50%~70%。
-- ❌ 錯誤:主表過濾寫在 ON 中,語義異常、優化器誤判
SELECT * FROM main m LEFT JOIN sub s ON m.id = s.id AND m.status = 'A';
-- ✅ 正確:ON 僅關聯 + 右表過濾,主表過濾放 WHERE
SELECT * FROM main m LEFT JOIN sub s ON m.id = s.id AND s.type = 'V'
WHERE m.status = 'A';
違規後果:結果集錯誤 (外連變內連)、謂詞下推失效全表掃描、執行計劃極差。
| # | 檢查項 | 驗收標準 |
|---|---|---|
| 1 | 大表是否落入多節點分區組 | 分區鍵合理、表空間綁定正確 |
| 2 | 批量裝載是否用 NOT LOGGED | 非關鍵可重建表全覆蓋 |
| 3 | 裝載後是否執行 RUNSTATS | 自動化腳本強制執行 |
| 4 | 高頻表是否設置 LOCKSIZE TABLE | 唯讀/維護窗口表已配置 |
| 5 | 臨時表是否精簡並建索引 | 代碼掃描無全量寬表入臨時表 |
| 6 | LEFT JOIN ON 子句語義合規 | 靜態分析規則攔截主表過濾 |
六大策略非孤立戰術,而是系統性優化體系:分區給算力、索引給路徑、無日誌給吞吐、表鎖給併發、精簡臨時表給內存、規範外連給正確性。建議將清單固化為團隊《DB2 SQL 開發規範》附件,納入 SonarQube 規則與 CI 門禁,讓優化從「事後救火」轉為「前置設計」。