數據庫效能始終是 DBA 與開發人員關注的核心議題。IBM DB2 提供了豐富的命令列工具與配置參數,幫助我們從 SQL 執行計劃、統計信息維護、索引設計、緩衝池管理、表重組到並行處理等多個維度進行深度調優。本文系統整理了實戰中高頻使用的 DB2 效能調優命令,並附帶範例與說明,供您快速查閱與實操參考。
掌握執行計劃是 SQL 調優的起點。DB2 提供兩大主流工具:
db2expln -d dbname -c pkgOwner -p pkgName -o expln.out
# 直接指定 SQL 字串
dynexpln -d eos -q "select * from eosmenu" -g -t
# 從檔案讀取 SQL
dynexpln -d eos -f query.sql -o out.txt
關鍵參數:-g 產生圖形化計劃、-t 顯示總成本、-o 指定輸出路徑。
優化器依賴準確的統計信息生成最優計劃。常用語法:
# 基本表與索引統計(允許並發讀取)
db2 runstats on table songxn.eosmenu and indexes songxn.ix1, songxn.ix2 allow read access
# 含分佈統計與詳細索引統計
db2 runstats on table songxn.eosmenu with distribution and detailed indexes all
建議:大量資料變更後、重組完成後、定期維護窗口中務必執行 RUNSTATS。
DB2 提供 0、1、2、3、5、7、9 共七個優化等級,預設為 5。等級越高,優化器搜尋空間越大,編譯耗時越久。
db2 update db cfg for dbname using DFT_QUERYOPT 3set current query optimization = 3OLTP 系統通常 3~5 即可;複雜報表查詢可嘗試 7 或 9。
# 唯一索引
create unique index ind1 on vicky.staff (dept, lastname);
# 包含非鍵值欄位(INCLUDE 欄位不參與排序,僅用於 Index-Only Access)
create unique index ind2 on vicky.employee (empno) include (lastname, salary);
create index ind3 on vicky.staff (dept) cluster;
叢集索引讓資料頁物理順序與索引順序一致,大幅提升範圍掃描效能。
| 模式 | 說明 |
|---|---|
| Index Scan | 走索引樹回表取數據 |
| Full Index Scan (Index Only) | 僅掃描索引葉頁,不回表 |
| Relation Scan | 全表掃描 |
# 查詢表索引
select indname from syscat.indexes where tabname='CUSTOMER';
# 索引建議器
db2advis -d dbname -i query.sql -o advis.out
# 或直接指定 SQL
db2advis -d dbname -s "select * from t1 where c1=?" -o advis.out
預留空間減少頁分裂,適用於頻繁 UPDATE/INSERT 的表。
# ALTER TABLE 方式(下次 REORG 生效)
alter table vicky.staff pctfree 30;
# LOAD 方式立即生效
load from staff.ixf of ixf modified by pagefreespace=30 replace into vicky.staff;
db2 create bufferpool bpname size 1000 pagesize 4k;
alter tablespace tbname bufferpool bpname;
當髒頁比例超過 CHNGPGS_THRESH(資料庫配置參數,預設 60%)時,頁面清理器會觸發寫入。
# 啟用/關閉延伸緩衝池
db2 alter bufferpool ibmdefaultbp extended storage;
db2 alter bufferpool ibmdefaultbp not extended storage;
相關參數:ESTORE_SEG_SZ、NUM_ESTORE_SEGS。
update db cfg for dbname using NUM_IOSERVERS <磁碟數+2>;
# 更新統計並檢查所有表
db2 reorgchk update statistics on table all;
# 僅用現有統計檢查單表
db2 reorgchk current statistics on table vicky.staff;
關鍵指標:
# 表重組(指定索引、臨時表空間、掃描模式)
db2 reorg table vicky.staff index ind1 use tempspace2 indexscan;
# 索引重組
db2 reorg indexes all for table vicky.staff allow read access cleanup only all;
# 允許寫入的線上重組
db2 reorg table vicky.staff index vicky.ind2 inplace allow write access;
# 暫停/恢復
db2 reorg table vicky.staff inplace pause;
db2 reorg table vicky.staff inplace resume;
# 查看歷史
db2 list history reorg all for dbname;
MQT 預先計算並儲存查詢結果,極大加速彙總類查詢。
CREATE TABLE vicky.mqt1 AS
( SELECT name, location, salary
FROM vicky.staff, vicky.org
WHERE staff.dept = org.deptnumb AND salary > 20000
) DATA INITIALLY DEFERRED REFRESH DEFERRED
ENABLE QUERY OPTIMIZATION;
# 手動刷新
REFRESH TABLE vicky.mqt1;
# 啟用自動路由(需統計信息)
RUNSTATS ON TABLE vicky.mqt1;
UPDATE DB CFG FOR sample USING DFT_REFRESH_AGE ANY;
# 實例級
UPDATE DBM CFG USING INTRA_PARALLEL YES;
# 資料庫級預設並行度
UPDATE DB CFG FOR EOS USING DFT_DEGREE ANY;
# 應用級
SET RUNTIME DEGREE FOR (25) TO 4;
SET RUNTIME DEGREE FOR ALL TO 6;
# 實例級硬上限
UPDATE DBM CFG USING MAX_QUERYDEGREE 6;
MDC 表按維度組織資料,實現區塊級索引,極適合數據倉庫星型模型。
CREATE TABLE vicky.sales
( YearAndMonth CHAR(4),
Region CHAR(20),
Product CHAR(2),
Sales BIGINT
) ORGANIZE BY DIMENSIONS (YearAndMonth, Region);
# 複合維度
CREATE TABLE vicky.table1
( col1 CHAR(10), col2 CHAR(10), col3 CHAR(10),
col4 INTEGER, col5 DECIMAL(10,2)
) ORGANIZE BY DIMENSIONS (col1, (col2, col3), col4);
DB2 效能調優是一項系統工程,需從「統計信息 → 執行計劃 → 索引 → 存儲佈局 → 記憶體/IO → 並行度」全鏈路把控。建議建立定期巡檢機制:每日 RUNSTATS、每週 REORGCHK、每月索引評估、每季緩衝池命中率分析,將調優從「救火」轉為「防火」。