透過 YDB6BWEXT 報告提供的 QUERYOPTBEFORE / QUERYOPTAFTER 兩個增強點,可在 SAP BI Read Interface 產生 ADBC/原生 SQL 前後,動態注入優化提示 (如 OPTIMIZATION LEVEL)。實施需套用 SAP Note 1143736 (NW 7.0+) 或 872397 (舊版),並聯繫 SAP Development Support 取得實作指南。
| 反模式 | 影響 | 建議改寫 |
|---|---|---|
| WHERE 條件含複雜運算式 | 無法使用索引/統計 | 移至應用層預算或建立產生欄 + 索引 |
| JOIN 謂詞含運算式 | 阻礙連結重排序 | 確保兩邊欄位直接比對,資料型態一致 |
| 本地謂詞對欄位套用函數 | SARGABLE 失效 | 改寫為範圍條件 (如 DATE(col) = ? → col BETWEEN ? AND ?) |
| 連結欄位資料型態不符 | 隱性轉換導致索引失效 | DDL 階段統一型態長度/編碼 |
| 非等值連結 (<>, !=, >, <) | 難以使用 Hash/Nest Loop 最佳化 | 評估改為等值 + 範圍或應用層過濾 |
| 不必要的 DISTINCT | 額外排序/雜湊成本 | 若 PK/FK 已保證唯一,移除 DISTINCT |
| 多餘 OUTER JOIN | 擴大中間結果集 | 改為 INNER JOIN 或移除無關聯表 |
SELECT ... FROM ...
WHERE ...
ORDER BY ...
FETCH FIRST 20 ROWS ONLY
OPTIMIZE FOR 20 ROWS;
FETCH FIRST N ROWS ONLY:限制回傳行數,優化器可選擇「首列快速回應」計畫。OPTIMIZE FOR N ROWS:引導優化器傾向 Nested Loop + 索引存取,而非 Hash Join 全掃描。| 參數/登錄變數 | 適用場景 | 建議值/策略 |
|---|---|---|
| DB2_REDUCED_OPTIMIZATION | 極複雜查詢編譯過久 | ON (降低優化積極度,縮短編譯時間) |
| DB2_WORKLOAD | SAP 應用專用 | ANALYTICS (BI/OLAP) 或 OLTP (ERP),自動調整一組預設參數 |
| OPTIMIZATION LEVEL (SAP: USE_OPTLEVEL) | 特定語句計畫不佳 | 語句層級覆蓋 (1-7),預設 5;僅作短期權宜 |
| REOPT (BIND 選項) | 參數化查詢值分布傾斜嚴重 | ONCE 或 ALWAYS 配合輸出變數使用 |
WITH DISTRIBUTION),對相關欄位收集多欄統計 (ON COLUMNS (A,B))。OPT_FOR_ROWS, USE_OPTLEVEL, &SUBSTITUTE LITERALS& 等) 僅作緊急臨時方案,長期應修正 ABAP 邏輯或建立適當索引。FOR ALL ENTRIES 查詢:依內表大小與連結複雜度,透過 rsdb/prefer_in_itab_opt (IN LIST)、rsdb/prefer_join (JOIN)、rsdb/prefer_union_all (UNION ALL) 三大參數控制 SQL 生成策略,僅在詳細分析或 SAP 建議下調整。當所有常規手段 (索引、統計、改寫、參數) 均無法達標,才考慮建立 OPTIMIZATION PROFILE 強制指定存取計畫,需極謹慎維護,升級風險高。

DB2 for SAP 效能調優核心在於:「查詢改寫避開反模式 → 統計資訊完備自動化 → 參數微調精準施策 → 最後才動用 Profile」。建立標準化調優清單並納入變更管理流程,才能持續保障 SAP 系統資料庫層效能穩定。