電商 OLTP 系統效能劣化時,DBA 面臨巨大業務壓力。隨意調參數、加索引往往事倍功半。本文提煉經驗為 10 大優先級技巧,構成「由基礎設施到應用層」的完整診斷鏈,助你在最短時間定位根因、精準施策。
db2 "UPDATE MONITOR SWITCHES USING
LOCK ON, SORT ON, BUFFERPOOL ON, UOW ON,
TABLE ON, STATEMENT ON"
AUTOSTART)。db2 "GET SNAPSHOT FOR DATABASE MANAGER"
關鍵指標:
| 指標 | 健康閾值 | 異常徵兆 | 對策 |
|---|---|---|---|
| Agents waiting for token | 0 | >0 | 增大 MAXAGENTS / MAX_COORDAGENTS |
| Agents stolen from another application | 0 | >0 | 同上,代理不足導致搶佔 |
| Idle agents | >0 | 長期=0 | 增加 NUM_INITAGENTS、NUM_POOLAGENTS |
db2 "GET SNAPSHOT FOR DATABASE ON <dbname>"
檢視 Database files closed:
MAXFILOP 過小,DB2 強制關閉舊檔案開啟新檔案 → CPU 浪費、I/O 延遲。db2 "UPDATE DB CFG FOR <dbname> USING MAXFILOP N"(建議 500+,視表空間/容器數而定)。db2 "UPDATE DB CFG FOR <dbname> USING LOCKTIMEOUT 15"(需確認應用能處理 SQL0911N)。Lock list memory in use > 50% LOCKLIST → 擴大 LOCKLIST。Lock waits、Time database waited on locks、Deadlocks detected、Lock escalations、Lock Timeouts。PREFETCHSIZE = EXTENTSIZE × 容器數(如 32 × 3 = 96)。db2 "LIST TABLESPACES SHOW DETAIL" → 確認 Number of containers = 3、Prefetch size = 96。db2 "GET SNAPSHOT FOR DATABASE ON <dbname>"
計算兩個關鍵比率:
Sort overflows * 100 / Total sorts < 3%(理想 < 1%)。超標 = 存在大排序,需優化 SQL/索引/叢集,而非單純加大 SORTHEAP。Total sorts / (Commits + Rollbacks) < 5。超標 = CPU 密集型小排序過多,需改寫 SQL 避免排序。SORTHEAP 預設 256 頁 (1MB) 通常足夠 OLTP;大幅調大只會掩蓋問題、增加記憶體壓力。
db2 "GET SNAPSHOT FOR DATABASE ON <dbname>"
db2 "GET SNAPSHOT FOR TABLES ON <dbname>"
步驟:
Commit + Rollback。Rows Read。判讀:
RowsPerTX 應在 1-20 之間。RUNSTATS、叢集。Overflows 大 → 列遷移嚴重 → REORG。db2 "GET SNAPSHOT FOR TABLESPACES ON <dbname>"
每個表空間必答五題:
跨表空間比較:找出讀寫最慢者 → 檢查容器磁碟速度、容器大小均衡、預取大小設定、存取模式與預期是否一致(隨機讀表應有高命中率、低物理 I/O)。
常見錯誤:機器 8GB 卻只有一個 16MB IBMDEFAULTBP。
標準四池起步:
| 緩衝池 | 頁面大小 | 服務對象 | 調優目標 |
|---|---|---|---|
BP_SYSCAT | 4K/8K/16K/32K | SYSCATSPACE | 目錄快取,小而穩 |
BP_TEMP | 同臨時表空間 | TEMPSPACE* | 排序/雜湊溢寫,命中率次要 |
BP_RAND | 4K/8K/16K/32K | 隨機存取表空間(OLTP 核心表) | 高命中率、低同步讀 |
BP_SEQ | 同表空間 | 順序掃描表空間(數倉大表、歷史表) | 大預取、高異步讀比率 |
進階:熱點表獨享緩衝池(BP_HOT)、索引獨享(BP_IX)。
調優科學法:逐步增大 → 觀察命中率、同步讀、物理 I/O 率 → 至邊際收益遞減點 → 定期重評(業務增長)。
一條爛 SQL 可摧毀完美調優的資料庫。DBA 常被綁手綁腳:不能改 SQL(廠商封裝)、只能加索引、改叢集、改統計。
真實成本 = 單次執行成本 × 執行頻率。高頻低成本 SQL 總成本常超過低頻高成本 SQL。
CREATE EVENT MONITOR SQLCOST FOR STATEMENTS WRITE TO FILE '...'SET EVENT MONITOR SQLCOST STATE 1SET EVENT MONITOR SQLCOST STATE 0db2evmon -db <db> -evm SQLCOST > sqltrace.txtsqltrace.txt:聚合唯一 SQL、頻率、總 CPU/排序/IO 成本。RowsPerTX 表 → 在 Event Monitor 輸出搜尋該表名。EXPLAIN:對應用所有靜態/動態 SQL 跑 Explain,但耗時極長。人工分析 30 分鐘負載可能耗週。商業工具(如 SQL-GUY)可自動化識別高成本 SQL、聚合頻率與資源消耗,將分析時間壓縮至分鐘級。