Oracle 10g 大幅擴展優化器提示集,提供更精細的電子表格優化、連接方法控制、基數/選擇性干預、索引掃描抑制等能力。本文系統解析 12 大新 Hints 語法、參數、適用場景與組合策略。
| Hint | 功能領域 | 語法範例 | 適用場景 |
|---|---|---|---|
| SPREAD_MIN_ANALYSIS | 電子表格編譯優化 | /*+ SPREAD_MIN_ANALYSIS */ | 規則極多電子表格,忽略詳細依賴圖分析,保留過濾/修訂規則優化,大幅縮短編譯時間 |
| SPREAD_NO_ANALYSIS | 電子表格編譯優化 | /*+ SPREAD_NO_ANALYSIS */ | 完全跳過電子表格分析,忽略修訂規則與過濾產生,編譯時間降至最低 |
| USE_NL_WITH_INDEX | 連接方法控制 | /*+ USE_NL_WITH_INDEX(t1 idx_t1) */ | 強制巢狀迴圈連接,且內部表必須使用指定索引 (至少一個索引鍵參與連接條件) |
| CARDINALITY | 基數干預 | /*+ CARDINALITY(t 1000) *//*+ CARDINALITY(@subq 500) */ | 修正 CBO 基數估算偏差;可指定表、子查詢或整個查詢區塊 |
| SELECTIVITY | 選擇性干預 | /*+ SELECTIVITY(t 0.01) *//*+ SELECTIVITY((t1 t2) 0.001) */ | 指定單表或多表連接後的選擇性 (滿足條件行比例);與 CARDINALITY 同用於同組表時雙方失效 |
| NO_USE_NL | 連接方法抑制 | /*+ NO_USE_NL(emp) */ | 禁止指定表作為內部表的巢狀迴圈連接,僅考慮 HASH/SORT-MERGE |
| NO_USE_MERGE | 連接方法抑制 | /*+ NO_USE_MERGE(emp, dept) */ | 禁止指定表作為內部表的排序合併連接 |
| NO_USE_HASH | 連接方法抑制 | /*+ NO_USE_HASH(emp, dept) */ | 禁止指定表作為內部表的雜湊連接 |
| NO_INDEX_FFS | 索引掃描抑制 | /*+ NO_INDEX_FFS(t idx_t) */ | 禁止指定表的指定索引進行快速全索引掃描 (INDEX FAST FULL SCAN) |
-- 大量規則電子表格報表查詢
SELECT /*+ SPREAD_MIN_ANALYSIS */ ...
FROM spreadsheet_table
WHERE ...;
-- 極度優化編譯時間,接受較差執行計畫
SELECT /*+ SPREAD_NO_ANALYSIS */ ...
FROM spreadsheet_table
WHERE ...;
-- 修正單表基數估算
SELECT /*+ CARDINALITY(orders 5000) */ *
FROM orders
WHERE order_date > SYSDATE - 30;
-- 修正多表連接選擇性
SELECT /*+ SELECTIVITY((orders customers) 0.005) */ *
FROM orders, customers
WHERE orders.cust_id = customers.cust_id
AND customers.region = 'APAC';
-- 強制 HASH JOIN:同時抑制 NL 和 MERGE
SELECT /*+ NO_USE_NL(emp) NO_USE_MERGE(emp) */ *
FROM emp, dept
WHERE emp.deptno = dept.deptno;
-- 強制 NESTED LOOPS:抑制 HASH 和 MERGE
SELECT /*+ NO_USE_HASH(emp) NO_USE_MERGE(emp) USE_NL(emp) */ *
FROM emp, dept
WHERE emp.deptno = dept.deptno;
OPT_PARAM 動態修改優化器參數、OPT_ESTIMATE 更精細的基數/選擇性/成本干預ADAPTIVE 相關 Hints 控制自適應計畫10g 新 Hints 大幅增強了對 CBO 微觀行為的控制力,善用它們能解決統計資訊難以捕捉的邊緣案例效能問題。