複雜 SQL 剖析階段耗時往往超過執行階段。本文深度解析三大核心技術:ORDERED 提示跳過連接順序排列組合、ORDERED_PREDICATES 控制 WHERE 條件評估順序、OPTIMIZER_SEARCH_LIMIT 限制連接順序搜尋空間,附實戰案例與適用場景判斷。
SELECT /*+ ORDERED USE_NL(b) PARALLEL(e,4) */
e.ename, e.hiredate, b.comm
FROM emp e, bonus b
WHERE e.ename = b.ename;
USE_NL (巢狀迴圈)、USE_HASH (雜湊連接) 指定連接方法強制按 WHERE 子句書寫順序從前往後評估條件。
5-- Session 級調整 (測試用)
ALTER SESSION SET optimizer_search_limit = 10;
-- 系統級調整 (謹慎)
ALTER SYSTEM SET optimizer_search_limit = 10 SCOPE=BOTH;
| 設定值 | 效果 | 風險 |
|---|---|---|
| 較小 (如 5) | 剖析快,可能錯過最優順序 | 複雜查詢選擇次優計畫 |
| 較大 (如 20) | 搜尋更全面,剖析慢 | 剖析時間失控 |
| 極大 (如 100) | 接近窮舉 | 極高剖析 CPU、共用池壓力 |
-- 原始:剖析 45 分鐘
SELECT /*+ ORDERED
USE_HASH(fact)
USE_NL(dim1) USE_NL(dim2) USE_NL(dim3)
ORDERED_PREDICATES */
...
FROM small_filter_table sft, -- 驅動表:過濾後 10 行
large_fact_table fact, -- 事實表:億級
dim_table1 dim1, -- 維表 1
dim_table2 dim2, -- 維表 2
dim_table3 dim3 -- 維表 3
WHERE sft.filter_col = :b1
AND fact.fk1 = dim1.pk
AND fact.fk2 = dim2.pk
AND fact.fk3 = dim3.pk
AND fact.dt BETWEEN :start_dt AND :end_dt
AND dim1.attr = 'ACTIVE' -- 選擇性高,ORDERED_PREDICATES 使最先評估
AND dim2.type = 'SALES';
複雜 SQL 剖析慢?
↓
表數 ≥ 7? → 是 → ORDERED + 明確驅動表
↓ 否
WHERE 條件含 PL/SQL 函數/明確最強過濾條件? → 是 → ORDERED_PREDICATES
↓ 否
統計資訊不穩導致計畫抖動? → 是 → 降低 OPTIMIZER_SEARCH_LIMIT (5~10)
↓ 否
收集/鎖定統計資訊 + SQL Plan Baseline 固定計畫
ORDERED 需深度理解資料分布,錯誤驅動表會導致災難性計畫ORDERED_PREDICATES 不影響存取路徑,僅影響過濾順序OPTIMIZER_SEARCH_LIMIT 系統級修改影響全庫,建議 Session 級測試後再推廣掌握這三大技術,能在剖析優化層面精準干預複雜 SQL 效能問題,配合 SPM 構建穩定高效的執行環境。