復雜多表連接 (7+ 表) 的解析階段可能耗費 30+ 分鐘 (8 表 40,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;
USE_NL、USE_HASH、PARALLEL 組合使用。默認評估順序:
使用:
SELECT /*+ ORDERED_PREDICATES */ *
FROM big_table
WHERE expensive_plsql_func(col1) = 'Y' -- 高成本函數
AND col2 = 100; -- 低成本列比較
ALTER SESSION SET optimizer_search_limit = 5; -- 默認 5
-- 或實例級
ALTER SYSTEM SET optimizer_search_limit = 5 SCOPE=SPFILE;
SELECT /*+
ORDERED
ORDERED_PREDICATES
USE_HASH(t2 t3)
USE_NL(t4)
PARALLEL(t1, 8)
*/
t1.id, t2.name, t3.amount, t4.status
FROM fact_table t1
JOIN dim_small t2 ON t1.dim2_id = t2.id
JOIN dim_medium t3 ON t1.dim3_id = t3.id
JOIN dim_large t4 ON t1.dim4_id = t4.id
WHERE t1.dt = TRUNC(SYSDATE)
AND t2.is_active = 'Y'
AND expensive_check(t3.code) = 1
AND t4.region = 'APAC';
說明:
- fact_table 為驅動表 (日期分區裁剪後行數最少)
- ORDERED_PREDICATES 確保 t2.is_active 先於 expensive_check 評估
- 連接方式按維表大小選擇 HASH/NL
OPT_ESTIMATE 或 CARDINALITY Hint 修正基數。