多表連接時,Oracle 需評估所有連接順序排列組合 (8 表 = 40,320 種)。ORDERED 強制依 FROM 子句順序連接,首張表為驅動表 (應選擇回傳行數最少的表)。
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、PARALLEL 等 Hint 形成完整執行計畫控制。預設評估順序:
ORDERED_PREDICATES 強制依 WHERE 子句 撰寫順序 評估,適用:
SELECT /*+ ORDERED_PREDICATES */
*
FROM big_table
WHERE expensive_plsql_func(col) = 'Y' -- 故意放最後,避免大量呼叫
AND status = 'ACTIVE' -- 高選擇性條件放前面
AND created_date > SYSDATE - 30;
STAR_TRANSFORMATION Hint 觸發閾值 (表數 < 該值才啟用)。ALTER SESSION SET OPTIMIZER_SEARCH_LIMIT = 10; -- 允許最多評估 10! = 3.6M 種順序 (慎用) -- 或系統級 ALTER SYSTEM SET OPTIMIZER_SEARCH_LIMIT = 5 SCOPE=BOTH;
ORDERED 固定連接順序,搭配驅動表原則。ORDERED_PREDICATES。OPTIMIZER_SEARCH_LIMIT 通常保持預設,極少調整。