<?xml version="1.0" encoding="UTF-8"?>
<OPTPROFILE VERSION="9.7.0.0">
<STMTPROFILE ID="Sample">
<STMTKEY SCHEMA="XQPENG">
<![CDATA[select a.c3,b.c3 from t2 a,t1 b where a.c1=b.c1 and a.c1<100 and b.c2 >60]]>
</STMTKEY>
<OPTGUIDELINES>
<HSJN> <!-- 指定 Hash Join -->
<Access TABLEID='b'/> <!-- t1 為小表建 Hash Table -->
<Access TABLEID='a'/> <!-- t2 為大表探查 -->
</HSJN>
</OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE>
| 類別 | 規則元素 | 功能 | 典型參數 |
|---|---|---|---|
| 通用優化 | REOPT | 主變量/參數標記重優化頻率 | ONCE / ALWAYS / NONE |
| QRYOPT | 優化等級 | 1,2,3,5,7,9 (預設 5) | |
| DEGREE | 並行度 | -1 (自動) / 具體數值 | |
| INLIST2JOIN | IN 列表轉連接重寫 | ENABLE / DISABLE + TABLE + COLUMN | |
| BLOCKING | 游標阻塞 | YES / NO | |
| 存取路徑 | TBSCAN | 強制表掃描 | TABLE |
| IXSCAN | 強制索引掃描 | TABLE + INDEX | |
| LPREFETCH | List Prefetch | TABLE + INDEX | |
| IXAND | Index ANDing | TABLE + 多個 INDEX | |
| IXOR | Index ORing | TABLE + 多個 INDEX | |
| 連接方法 | NLJOIN | Nested Loop Join | 子元素指定內外表存取 |
| MSJOIN | Merge Sort Join | 同上 | |
| HSJOIN | Hash Join | 同上 (可指定 Build/Probe 端) | |
| 其他 | SORT | 排序行為 | TABLE + 選項 |
| TEMPTABLE | 暫存表物化 | TABLE | |
| XJOIN | XML 連接 | XML 專用 |
CREATE TABLE SYSTOOLS.OPT_PROFILE (
SCHEMA VARCHAR(128) NOT NULL,
NAME VARCHAR(128) NOT NULL,
PROFILE BLOB(2M) NOT NULL,
PRIMARY KEY (SCHEMA, NAME)
);
OptProfile.del):
XQPENG,HSJOIN,HSJOIN.xml
IMPORT FROM OptProfile.del OF DEL MODIFIED BY LOBSINFILE
INSERT INTO SYSTOOLS.OPT_PROFILE
db2set DB2_OPTPROFILE=YES
db2stop; db2start # 生效
SET CURRENT OPTIMIZATION PROFILE = XQPENG.HSJOIN
原始查詢:select t1.c3,t2.c3 from t2,t1 where t1.c1=t2.c1 and t1.c1<100 and t2.c2>60
優化器預設計劃:t2 (Build) → t1 (Probe),總成本 804.126
業務實況:t1 符合列數遠少於 t2,應以 t1 Build Hash Table
剖面指導:<HSJN><Access TABLEID='b'/><Access TABLEID='a'/></HSJN> (b=t1, a=t2)
套用後計劃:t1 (Build) → t2 (Probe),總成本 804.126 (成本相同但實際執行時間大幅下降)
# 清除特定剖面快取
FLUSH OPTIMIZATION PROFILE CACHE XQPENG.HSJOIN
# 清除所有剖面快取
FLUSH OPTIMIZATION PROFILE CACHE ALL
優化剖面是 DB2 給資深 DBA 的「手術刀」:**外部化、非侵入式、多維度指導執行計劃**。掌握 XML 結構、四大類規則、部署流程與快取管理,配合「審慎使用、定期審查」原則,即可在成本優化器失效的邊界場景中精準接管控制權,實現確定性效能保障。