第 4 步最耗時,特別是多表連接。
| 表數 | 排列數 (N!) |
|---|---|
| 6 | 720 |
| 10 | 3,628,800 |
| 15 | 1,307,674,368,000 (1.3 兆) |
| 參數 | 預設 | 作用 |
|---|---|---|
OPTIMIZER_SEARCH_LIMIT | 5 | 表數 ≤ 此值時窮舉所有連接順序;> 此值時啟發式搜尋。 |
OPTIMIZER_MAX_PERMUTATIONS | 80,000 | 最大評估組合數上限(無論表數)。 |
兩者**同時生效**:優化器在達到任一上限即停止搜尋,選擇當前最低成本計畫。
SELECT /*+ ORDERED USE_NL(b) PARALLEL(e,4) */
e.ename, e.hiredate, b.comm
FROM emp e, bonus b
WHERE e.ename = b.ename;
ORDERED:按 FROM 子句順序連接,第一張表為驅動表。USE_NL/USE_HASH/USE_MERGE 指定連接方法。OPTIMIZER_SEARCH_LIMIT = 表數,讓優化器窮舉找到最佳順序。ORDERED Hint,驗證執行計畫最優。CREATE OUTLINE ol_emp_bonus FOR CATEGORY monthly_rpt
ON SELECT /*+ ORDERED USE_NL(b) */ ...;
USE_STORED_OUTLINES = TRUE,該查詢自動套用固化計畫,跳過優化器搜尋。DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE 將優秀計畫載入 Baseline。OPTIMIZER_SEARCH_LIMIT/MAX_PERMUTATIONS 可限制搜尋空間。ORDERED Hint 手工指定順序,配合 Stored Outline/SPM 固化,徹底消除解析期開銷。