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

DB2 資料庫優化六大實用策略:索引、分區、日誌、鎖、臨時表與 LEFT JOIN 精要

     編輯:DB2 教學

策略一:索引建立時機與 RUNSTATS 鐵律

  • 插入前建索引:索引隨資料同步維護,統計自然準確,但產生大量日誌 → 搭配 NOT LOGGED INITIALLY 或 LOAD NONRECOVERABLE 降低日誌量。
  • 插入後建索引:大量載入極快,但統計過期 → 必須 RUNSTATS ON TABLE schema.tab AND INDEXES ALL 更新統計,否則優化器不使用索引。

策略二:大表置於多節點表空間 + 分區鍵 + 索引

  • 單節點表空間(如 DIM)受限於單節點 CPU/記憶體(例:2 CPU + 4GB)。
  • 多節點表空間 + 合理分區鍵 → 32 節點並行掃描/連接,結果匯總到協調節點,速度提升數量級。
  • 索引仍為關鍵加速器:叢集索引減少 I/O,覆蓋索引避免回表。

策略三:大量寫入採用非記錄模式

模式日誌量速度風險適用
完全記錄大慢可回滾/前滾核心 OLTP
NOT LOGGED INITIALLY極少極快失敗表報廢,需重建資料倉庫載入、暫存表
LOAD NONRECOVERABLE無最快不可前滾,載入後必須備份TB 級初始化

策略四:表級鎖減少鎖記憶體壓力

  • 鎖上限由 LOCKLIST、MAXLOCKS 控制,行級鎖易耗盡 → 鎖升級 → 並發崩潰。
  • LOCK TABLE tab IN EXCLUSIVE MODE 或 SHARE MODE 將數萬行鎖縮減為 1 把表鎖。
  • 適用:批次大量更新/刪除、資料匯入、無並發衝突的維護窗口。

策略五:臨時表只裝必要欄位/列 + 針對性索引

  • 錯誤:INSERT INTO temp SELECT * FROM big_table → 臨時表膨脹 10 倍。
  • 正確:DECLARE GLOBAL TEMPORARY TABLE session.temp AS (SELECT id, name, dept FROM big WHERE status='A') DEFINITION ONLY → 僅投影必要欄位。
  • 在臨時表建立針對後續查詢謂詞的索引(如 CREATE INDEX session.ix_temp_dept ON session.temp(dept))。
  • 使用 DGTT(DECLARE GLOBAL TEMPORARY TABLE)自動隔離會話、提交/斷開自動清理。

策略六:LEFT JOIN 條件撰寫鐵律

錯誤:主表過濾寫在 ON 子句

SELECT a.*, b.col
FROM main a
LEFT JOIN sub b ON a.id = b.id AND a.status='ACTIVE'  -- ❌
WHERE b.type='X';

後果:語意錯誤、優化器誤判、無法利用主表索引。

正確:ON 僅含連接鍵 + 右表條件,主表條件進 WHERE

SELECT a.*, b.col
FROM main a
LEFT JOIN sub b ON a.id = b.id AND b.type='X'  -- ✅
WHERE a.status='ACTIVE';                       -- ✅
  • 保留語意正確、優化器可推導最佳路徑。

一頁檢查清單

  1. ✅ 索引 + RUNSTATS(插入前/後皆可,統計必新)
  2. ✅ 大表 → 多節點分區 + 分區鍵 + 索引
  3. ✅ 大量寫入 → NLI / NONRECOVERABLE + 事後備份
  4. ✅ 批次大量改 → 表級鎖
  5. ✅ 臨時表 → 僅必要欄位/列 + 針對性索引
  6. ✅ LEFT JOIN → ON: 連接鍵 + 右表條件;WHERE: 主表條件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved