效能是隨需應變應用程式成敗的關鍵。當應用程式以 IBM DB2 Universal Database 作為資料存儲,從一開始就掌握在 DB2 UDB 上獲得最佳效能的基礎知識至關重要。本文提供調優 DB2 UDB V8 系統的深入建議,涵蓋從建立新資料庫到運行應用程式的完整流程。
執行下列十項行動,通常透過約 10% 的配置變化即可達到 90% 的最佳效能潛力(括號內為對應章節):
NEWLOGPATH 指定 (實驗調整)。db2empfa 支援 SMS 多頁分配 (表空間)。建立資料庫預設產生 3 個 SMS 表空間 (SYSCATSPACE, TEMPSPACE1, USERSPACE1) 與 4MB 緩衝池 (IBMDEFAULTBP),頁面大小 4KB。建議刪除 TEMPSPACE1、USERSPACE1 重建。SYSCATSPACE 幾乎無需優化,但跨幾顆磁碟可略增效能。可使用 CREATE DATABASE 的 AUTOCONFIGURE 選項依環境初始化配置(列表 1),參數詳見表 1。
create database prod1 catalog tablespace
managed by system using ('c:proddbcattbs1','d:proddbcattbs2')
extentsize 16 prefetchsize 32
autoconfigure using mem_percent 50 workload_type simple num_stmts 10
tpm 20 admin_priority performance num_local_apps 2 num_remote_apps 200
isolation CS bp_resizeable yes apply db and dbm
表 1. 自動配置選項
| 關鍵字 | 有效值 | 預設 | 說明 |
|---|---|---|---|
| mem_percent | 1-100 | 25 | 分配給資料庫的實體記憶體百分比 |
| workload_type | simple, mixed, complex | mixed | simple=I/O 密集/OLTP;complex=CPU 密集/OLAP |
| num_stmts | 1-1000000 | 25 | 每工作單元陳述式數 |
| tpm | 1-200000 | 60 | 每分鐘交易數 |
| admin_priority | performance, recovery, both | both | 優化效能或恢復時間 |
| num_local_apps | 0-5000 | 0 | 本地應用連接數 |
| num_remote_apps | 0-5000 | 100 | 遠端應用連接數 |
| isolation | RR, RS, CS, UR | RR | 隔離等級 |
| bp_resizeable | yes, no | yes | 緩衝池是否可線上調整大小 |
若建立資料庫時已用自動配置,此步驟非必要。Configuration Advisor 為 GUI 工具,依回答問題自動配置資料庫與實例,常帶來可觀效能提升。從 Control Center 右鍵資料庫選擇開啟,完成後可套用結果(圖 1)。

此上限限制資料庫全域記憶體(緩衝池等)總量:
boot.ini /3GB 開關)64 位系統無此限制。估算全域記憶體用量公式(列表 2):
buffer pools + dbheap + util_heap_sz + pkgcachesz + aslheapsz + locklist + 約 10% 額外開銷
若啟用 INTRA_PARALLEL,加上 sheapthres_shr
每種表空間頁面大小至少需一個緩衝池。預設 IBMDEFAULTBP 留給系統編目。初學者建議每種頁面大小一個緩衝池,DB2 自我調優能力強,將熱門資料留在記憶體。若有時間且需改進,可採多緩衝池策略(熱門表、索引、臨時、冷門表分離),初學者 4 個較適:中型臨時、大型索引、大型熱門表、小型冷門/順序存取表。DMS 純 LOB 表空間可指派任意緩衝池(LOB 不佔用緩衝池)。
切勿超分配導致 OS 記憶體分頁(災難性)。無監控時難以精確預估。經驗法則:OLTP 分配 75% 可用記憶體;OLAP/DSS 分配 50% 給緩衝池,剩餘 50% 給 SORTHEAP。
依賴預讀的 OLAP 查詢受益於區塊緩衝池。預設為頁基礎,預讀將相鄰頁讀入不相鄰記憶體;區塊緩衝池使用區塊 I/O 一次讀入多頁,顯著提升順序預讀效能。CREATE/ALTER BUFFERPOOL 的 NUMBLOCKPAGES 定義區塊記憶體大小,BLOCKSIZE 指定每區塊頁數(設為表空間 EXTENTSIZE)。共用相同區段大小的表空間應專用同一區塊緩衝池。NUMBLOCKPAGES 應為 BLOCKSIZE 倍數且 ≤ 緩衝池頁數 98%,建議起始設 ≤ 總大小 15%,後續依快照監控調整。
使用 DB2 Control Center 最容易(右鍵 Table Spaces -> Create)。
db2empfa 支援多頁分配(一次一區段增長而非一頁)。可選 4/8/16/32 KB。頁面大小決定表空間最大尺寸 (4KB=64GB/分區, 32KB=512GB/分區)。OLTP 隨機更新宜小頁面(節省緩衝池);OLAP 大量連續存取宜大頁面(減少 I/O 請求、減少索引層數)。例外:列長 < 頁面大小/255 時會浪費空間(每頁最多 255 行),此時小頁面較佳。例:32KB 頁存 100 byte 列,每頁最多 255 行 = 25.5KB,浪費 ~7KB。
起始每種頁面大小一個緩衡池、一個系統臨時表空間。若追求效能,用 DMS 依使用模式組織表,配合多緩衝池策略。每種頁面大小建立:系統臨時、索引常規、熱門表常規、冷門表常規、LOB 大型表空間。容器佈局:每 CPU 6-10 顆磁碟,每表空間跨越所有磁碟(每磁碟一容器)。UNIX 每磁碟建立對應邏輯卷,非 raw device 需建檔案系統。磁碟陣列用單一容器並設定 DB2_PARALLEL_IO(詳概要註冊表)。
Extent Size: 建立時定義,後難修改。依表平均大小:<25MB 用 8;25-250MB 用 16;250MB-2GB 用 32;>2GB 用 64。OLAP/全表掃描/高增長表用較大值。磁碟陣列設為條紋大小。Prefetch Size: 可 ALTER TABLESPACE 修改。最佳值:PrefetchSize = (不同實體磁碟容器數) * ExtentSize;陣列上:PREFETCH SIZE = EXTENT SIZE * (非同位磁碟數)。
MDC 提供多維度靈活、連續、自動叢集,提升複雜查詢效能,減少插入/更新/刪除時的 REORG 與索引維護需求。適合範圍/等值/連接謂詞的多行查詢。避免唯一值列作為維度;維度組合單元需有足夠行填滿區段大小以達最佳效能。
MQT 提升含 GROUP BY、GROUPING、RANK、ROLLUP 的 OLAP 查詢效能。DB2 透明選擇使用 MQT 內部維護的彙總結果,避免掃描 GB 級原始數據。可跨分區複寫避免資料分散,提升合併連接效能。
VALUE COMPRESSION + COMPRESS SYSTEM DEFAULT 節省磁碟與縮短查詢時間。APPEND ON 避免搜尋空間,直接尾端附加(若依賴特定順序勿用)。LOCKSIZE TABLE,避免行鎖開銷與減少 LOCKLIST 需求。PCTFREE 保留空間助未來 INSERT/LOAD/REORG(預設 10;叢集索引+大量插入試 20-35;用 APPEND ON 設 0)。VOLATILE 鼓勵索引掃描(基數劇烈波動時),前提索引含所有被引用列或可應用謂詞。NOT LOGGED INITIALLY 關閉交易期間日誌(至 COMMIT)。VALUE COMPRESSION/COMPRESS SYSTEM DEFAULT 亦可用於 ALTER TABLE。Design Advisor 可推薦/評估索引,減輕設計負擔。仍需注意:
INCLUDE 子句將查詢引用欄位含入索引頁(非索引鍵),促進純索引存取避免資料頁 FETCH。用 CREATE INDEX ... CLUSTER 建立,依結果集物理順序排序資料列。最佳於小型資料類型 (INT, CHAR(10))、唯一值列、常用範圍搜尋列。優點:線性存取模式、有效預讀、避免排序。缺點:插入較慢。建議 PCTFREE 設 15-35 容納大量插入。極大量插入考慮單維 MDC 表(如生成欄 idcol/1000),產生區塊索引而非行索引,索引更小、插入日誌大減。
PCTFREE 0,其他 10;叢集索引表設 15-35 防碎片。ALLOW REVERSE SCANS 啟用雙向掃描(升序/降序皆快),無負面效能影響。INCLUDE 含非索引欄位於索引頁,促進純索引存取。UNIQUE 強制唯一性。REORG INDEXES 轉換。DB2 註冊表變數影響最佳化器與引擎行為。常用變數:
| 命令 | 說明 |
|---|---|
db2set -all | 列出所有設定變數 |
db2set -g | -i variable=value | 設定全域 (-g) 或實例 (-i) 級變數(變數與值間勿留空格) |
*;部分表空間設其 ID (逗號分隔)。確保預讀大小明顯大於區段大小。應用啟動時常暴露配置參數問題。若無錯誤/警告即安全。常見記憶體不足相關參數:
MON_HEAP_SZ (DBM):監視器堆。快照/事件監視器需由此分配。不足時設 256 並遞增 256 至錯誤消失。QUERY_HEAP_SZ (DBM):查詢堆(代理私有記憶體存查詢、區塊游標)。必須 ≥ ASLHEAPSZ。錯誤時設 ≥ 5x ASLHEAPSZ。MAXAPPLS (DB):最大並發應用連接數。最小設 ≥ 用戶連接數。詳見 MAXAGENTS。STMTHEAP (DB):陳述式堆(編譯工作區)。警告/錯誤時遞增 256 至消失。APPLHEAPSZ (DB):應用程式堆(代理處理請求私有記憶體)。遞增 256 至錯誤消失。快照監控識別資料庫隨時間行為(記憶體使用、鎖獲取等),用於微調配置、識別長執行陳述式。若已用 Configuration Advisor 則效益有限。收集數據最簡單方式:應用運行時用腳本定期抽樣快照(列表 3 UNIX、列表 4 Windows)。先跑 60 秒、數次間歇,取得良好抽樣且資料量可控。
# getsnap.ksh 關鍵片段
db2 update monitor switches using bufferpool on lock on sort on statement on table on uow on
# 循環抽樣
vmstat $stat_interval $stat_iterations > vmstat_$i2
iostat $stat_interval $stat_iterations > iostat_$i2
db2 -v reset monitor all
sleep $sleep_interval
db2 -v get snapshot for dbm > snap_$i2
db2 -v get snapshot for all on $dbname >> snap_$i2
db2 update monitor switches using bufferpool off lock off sort off statement off table off uow off
腳本含 get snapshot for dynamic SQL。關鍵輸出欄位:
對每個緩衝池計算命中率 (BPHR),理想 >90%。公式:
BPHR (%) = (1 - (("Buffer pool data physical reads" + "Buffer pool index physical reads") /
("Buffer pool data logical reads" + "Buffer pool index logical reads"))) * 100
範例:邏輯讀 370+221=591,實體讀 54+94=148,BPHR = (1-148/591)*100 = 74.96%。緩衝池僅 250 頁 (1MB),值得增大觀察 BPHR 變化。若仍低,需重新設計邏輯佈局(參閱建立緩衝池/表空間章節)。
區塊緩衝池若 Block IOs 低,增大 NUMBLOCKPAGES;若增大後 Block IOs 上升則續增;若反效果則減小。
DB2 參數眾多,多數自動配置或預設良好。僅說明常需額外配置者。部分需實例循環 (db2stop/start) 或資料庫重啟生效。基本管理命令(表 3)。變更後用 GET DBM/DB CFG SHOW DETAIL 確認 Delayed Value 與 Current Value 一致(列表 7 範例)。
(前文已述 32 位系統上限)必須確保總分配未超限,否則 OS 分頁導致效能災難。
Piped sorts accepted 明顯低於 requested,增大可提升效能。Post threshold sorts 高 (兩位數) 也應增大。Total Private Sort heap allocated 應 < SHEAPTHRES。Agents stolen from another application = 0。High water mark for agents registered 為歷史峰值。Max agents overflow 為達上限後被拒請求數。Agents created from empty pool / Agents assigned from pool 比率高 (≥5:1) 應增大 NUM_POOLAGENTS;比率低則可能設過高浪費資源。Free FCM buffers low water mark < 15% FCM_NUM_BUFFERS,增大至 ≥15%。Lock list memory in use > 50% 定義大小則增大 LOCKLIST (4KB 頁)。發生 Lock escalations 增大 LOCKLIST 和/或 MAXLOCKS。減少鎖:用最低隔離等級、頻繁 Commit、大量更新前顯式 LOCK TABLE、偏好 CS (預設) 或 UR。Lock Timeouts 高可能因:值太低、交易持鎖久、鎖升級。INTRA_PARALLEL=YES 或 Concentrator 開啟時適用。WITH HOLD 游標排序由此分配。Shared Sort heap high water mark 遠低於上限則減少釋放記憶體;接近上限則需增大。