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

調優 DB2 UDB v8.1 及其資料庫的最佳實踐 (1)

     編輯:DB2 教學

簡介

效能是隨需應變應用程式成敗的關鍵。當應用程式以 IBM DB2 Universal Database 作為資料存儲,從一開始就掌握在 DB2 UDB 上獲得最佳效能的基礎知識至關重要。本文提供調優 DB2 UDB V8 系統的深入建議,涵蓋從建立新資料庫到運行應用程式的完整流程。

讀前須知

  • 確保已套用最新 DB2 修補包(本文基於 FixPak 4),修補包常帶來效能提升。
  • 擁有可重現的工作負載場景,以量化調優效果(避免負載波動干擾)。
  • 堅持記錄所有變更,利於開發調優腳本、歷史追溯與避免不良變更。

「十大」效能增強關鍵

執行下列十項行動,通常透過約 10% 的配置變化即可達到 90% 的最佳效能潛力(括號內為對應章節):

  1. 足夠磁碟: 每 CPU 6-10 顆磁碟起步。每個表空間容器跨越所有可用磁碟(SYSCATSPACE 等小表空間除外)(表空間)。
  2. 緩衝池記憶體: 佔可用記憶體 ~75% (OLTP) 或 ~50% (OLAP) (緩衝池)。
  3. 全面 Runstats: 所有表(含系統編目表)執行 RUNSTATS (Runstats)。
  4. Design Advisor: 依 SQL 工作負載推薦索引與評估現有索引 (Design Advisor)。
  5. Configuration Advisor: 依應用環境自動配置資料庫管理器與資料庫 (Configuration Advisor)。
  6. 日誌獨立磁碟: 交易日誌置於獨立高速磁碟,由 NEWLOGPATH 指定 (實驗調整)。
  7. 頻繁 Commit: 增加並發性 (SQL 語句調優)。
  8. 增加 SORTHEAP: 避免排序溢出 (DBM/DB 配置)。
  9. 表空間類型選擇: 編目/臨時表空間用 SMS,其餘用 DMS (raw device 或檔案);執行 db2empfa 支援 SMS 多頁分配 (表空間)。
  10. 參數標記: 重複陳述式使用參數標記 (SQL 語句調優)。

建立資料庫

建立資料庫預設產生 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_percent1-10025分配給資料庫的實體記憶體百分比
workload_typesimple, mixed, complexmixedsimple=I/O 密集/OLTP;complex=CPU 密集/OLAP
num_stmts1-100000025每工作單元陳述式數
tpm1-20000060每分鐘交易數
admin_priorityperformance, recovery, bothboth優化效能或恢復時間
num_local_apps0-50000本地應用連接數
num_remote_apps0-5000100遠端應用連接數
isolationRR, RS, CS, URRR隔離等級
bp_resizeableyes, noyes緩衝池是否可線上調整大小

Configuration Advisor

若建立資料庫時已用自動配置,此步驟非必要。Configuration Advisor 為 GUI 工具,依回答問題自動配置資料庫與實例,常帶來可觀效能提升。從 Control Center 右鍵資料庫選擇開啟,完成後可套用結果(圖 1)。

Configuration Advisor 結果畫面

建立緩衝池

32 位系統共享記憶體上限

此上限限制資料庫全域記憶體(緩衝池等)總量:

  • AIX / Linux: 1.75 GB
  • Sun: 3.35 GB
  • HP-UX: ~800 MB
  • Windows: 2-3 GB (需 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)。

表空間類型:DMS vs SMS

  • 系統臨時/編目表空間: 用 SMS,動態增長收縮。大量臨時表刷新磁碟時 DMS 較有效。使用 SMS 時務必執行 db2empfa 支援多頁分配(一次一區段增長而非一頁)。
  • 其他表空間: 用 DMS。允許表跨多表空間(索引/用戶數據/LOB 分離),減少預讀/更新爭用。DMS raw device 可再擠出 5-10% 效能。

頁面大小選擇

可選 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)

MDC 提供多維度靈活、連續、自動叢集,提升複雜查詢效能,減少插入/更新/刪除時的 REORG 與索引維護需求。適合範圍/等值/連接謂詞的多行查詢。避免唯一值列作為維度;維度組合單元需有足夠行填滿區段大小以達最佳效能。

物化查詢表 (MQT)

MQT 提升含 GROUP BY、GROUPING、RANK、ROLLUP 的 OLAP 查詢效能。DB2 透明選擇使用 MQT 內部維護的彙總結果,避免掃描 GB 級原始數據。可跨分區複寫避免資料分散,提升合併連接效能。

CREATE TABLE 選項建議

  • ≤30 byte 列避免 VARCHAR(浪費空間),用 CHAR。
  • IDENTITY/SEQUENCE 至少用預設緩存 20(除非間隔關鍵),減少請求 DBM 產生數值與日誌開銷。
  • 大量空值/系統預設值時,用 VALUE COMPRESSION + COMPRESS SYSTEM DEFAULT 節省磁碟與縮短查詢時間。

ALTER TABLE 選項建議

  • 大量插入表用 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 可推薦/評估索引,減輕設計負擔。仍需注意:

  • 查詢須合理時間內完成時避免加索引(拖慢更新、佔空間)。
  • 高基數列適合索引。
  • 避免超過 5 個欄位於索引(管理開銷)。
  • 多欄索引將最常引用列置前。
  • 避免與現有索引相似(如已有 (c1,c2) 又建 (c2)),應修改現有索引加欄位。
  • 唯讀大表可用 INCLUDE 子句將查詢引用欄位含入索引頁(非索引鍵),促進純索引存取避免資料頁 FETCH。

叢集索引

用 CREATE INDEX ... CLUSTER 建立,依結果集物理順序排序資料列。最佳於小型資料類型 (INT, CHAR(10))、唯一值列、常用範圍搜尋列。優點:線性存取模式、有效預讀、避免排序。缺點:插入較慢。建議 PCTFREE 設 15-35 容納大量插入。極大量插入考慮單維 MDC 表(如生成欄 idcol/1000),產生區塊索引而非行索引,索引更小、插入日誌大減。

CREATE INDEX 選項

  • 唯讀表索引 PCTFREE 0,其他 10;叢集索引表設 15-35 防碎片。
  • ALLOW REVERSE SCANS 啟用雙向掃描(升序/降序皆快),無負面效能影響。
  • INCLUDE 含非索引欄位於索引頁,促進純索引存取。
  • UNIQUE 強制唯一性。
  • Type-2 索引:減少 next-key 鎖、支援 >255 byte 索引鍵、線上 REORG/RUNSTATS、支援 MDC。V8 新索引預設 Type-2;舊 Type-1 可用 REORG INDEXES 轉換。

概要註冊表配置

DB2 註冊表變數影響最佳化器與引擎行為。常用變數:

命令說明
db2set -all列出所有設定變數
db2set -g | -i variable=value設定全域 (-g) 或實例 (-i) 級變數(變數與值間勿留空格)
  • DB2_PARALLEL_IO: 促使磁碟陣列上表空間並行存取。全陣列設 *;部分表空間設其 ID (逗號分隔)。確保預讀大小明顯大於區段大小。
  • DB2_EVALUNCOMMITTED: 預設 OFF。設 ON 將鎖操作延至謂詞評估,減少 Oracle 移植應用的鎖爭用。
  • DB2_SKIPDELETED: 預設 OFF。設 ON 允許 CS/RS 陳述式跳過已刪除鍵/列,同樣減少 Oracle 移植應用鎖爭用。
  • DB2_HASH_JOIN: 預設啟用。禁用 (NO) 可能利於 OLTP。
  • (AIX) DB2_FORCE_FCM_BP: DPF 多邏輯分區設 YES 改善分區通訊,代價少一共享記憶體段供緩衝池。非 DPF 設 NO。
  • (AIX 4.3) DB2_MMAP_READ/WRITE: 預設啟用。32 位 DB2 記憶體受限時設 OFF 釋放一段共享記憶體 (~256MB) 供緩衝池,需測試確認效益。

透過配置避免執行期錯誤

應用啟動時常暴露配置參數問題。若無錯誤/警告即安全。常見記憶體不足相關參數:

  • 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

動態 SQL 陳述式分析

腳本含 get snapshot for dynamic SQL。關鍵輸出欄位:

  • Number of executions: 找出頻繁執行需調優的陳述式;計算平均執行時間。單次執行雖輕但累積大則需理解應用邏輯重設計。考慮參數標記避免重複編譯。
  • Rows read: 識別讀取行數最多的動態 SQL。高值通常意味表掃描或低選擇性索引掃描。用 Explain 驗證,再 RUNSTATS 或 Design Advisor 改善。
  • Total execution time: 總執行時間。除以執行次數得平均。高平均可能因表掃描、鎖等待、大量 I/O。頻繁 Commit 可緩解鎖等待。
  • Statement text: 陳述式文本。發現 WHERE 子句值不同但其餘相同者,用參數標記避免重複準備;餵給 Design Advisor 產生最佳索引。

緩衝池大小調整

對每個緩衝池計算命中率 (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 上升則續增;若反效果則減小。

DBM 與 DB 關鍵配置參數

DB2 參數眾多,多數自動配置或預設良好。僅說明常需額外配置者。部分需實例循環 (db2stop/start) 或資料庫重啟生效。基本管理命令(表 3)。變更後用 GET DBM/DB CFG SHOW DETAIL 確認 Delayed Value 與 Current Value 一致(列表 7 範例)。

共享記憶體分配參數注意 OS 限制

(前文已述 32 位系統上限)必須確保總分配未超限,否則 OS 分頁導致效能災難。

關鍵參數詳細調優指引

  • SHEAPTHRES (DBM): 實例並發私有排序記憶體總量。OLTP 起始 ~20000,OLAP 40000-60000。若 Piped sorts accepted 明顯低於 requested,增大可提升效能。Post threshold sorts 高 (兩位數) 也應增大。Total Private Sort heap allocated 應 < SHEAPTHRES。
  • MAXAGENTS (DBM): 最大代理數。受限記憶體環境用以限制總記憶體。增大至 Agents stolen from another application = 0。High water mark for agents registered 為歷史峰值。Max agents overflow 為達上限後被拒請求數。
  • NUMDB (DBM): 同時啟用本地資料庫數。生產建議 1/實例;否則設最大同時啟用數。
  • NUM_INITAGENTS / NUM_POOLAGENTS (DBM): 池中初始/最大空閒代理數。設為預期並發實例級連接平均數 (OLAP 較低,OLTP 較高)。大量 ramp-up 連接基準測試設 NUM_INITAGENTS = 預期連接數。三層連線池環境影響小。若 Agents created from empty pool / Agents assigned from pool 比率高 (≥5:1) 應增大 NUM_POOLAGENTS;比率低則可能設過高浪費資源。
  • FCM_NUM_BUFFERS (DBM): 僅 DPF 多邏輯分區用。指定 4KB 緩衝區數供內部通訊。若 Free FCM buffers low water mark < 15% FCM_NUM_BUFFERS,增大至 ≥15%。
  • AVG_APPLS (DB): 僅複雜 SQL (Join/函數/遞迴) 時修改,否則保 1。設為平均連接數 x 複雜 SQL 百分比。
  • LOCKLIST / MAXLOCKS (DB): 鎖清單記憶體。32 位首鎖 72B/後續 36B;64 位 112B/56B。應用佔用達 MAXLOCKS% 觸發鎖升級 (行鎖->表鎖),LOCKLIST 將盡時強制升級。鎖表大幅降低並發、增加死鎖機率。Lock list memory in use > 50% 定義大小則增大 LOCKLIST (4KB 頁)。發生 Lock escalations 增大 LOCKLIST 和/或 MAXLOCKS。減少鎖:用最低隔離等級、頻繁 Commit、大量更新前顯式 LOCK TABLE、偏好 CS (預設) 或 UR。
  • LOCKTIMEOUT (DB): 等待鎖秒數 (-1 為無限等待)。生產 OLAP 起始 60s,OLTP ~10s,開發 -1 識別鎖等待。高並發可能需增大 OLTP 值避免回滾。Lock Timeouts 高可能因:值太低、交易持鎖久、鎖升級。
  • SHEAPTHRES_SHR (DBM): 並發共享排序記憶體硬性上限。僅 INTRA_PARALLEL=YES 或 Concentrator 開啟時適用。WITH HOLD 游標排序由此分配。Shared Sort heap high water mark 遠低於上限則減少釋放記憶體;接近上限則需增大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved