Oracle 複雜查詢剖析階段耗時可達數十分鐘(如 8 表連接 40,000+ 連接順序排列)。本文介紹三種減少剖析開銷、加速執行的實戰技巧:ORDERED 提示固定連接順序、ORDERED_PREDICATES 控制謂詞求值順序、optimizer_search_limit 限制優化器搜索空間。
Oracle 優化器需評估所有表連接順序排列,表數越多排列數呈階乘增長(8 表 = 40,320 種),剖析時間可達 30 分鐘+。
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(嵌套循環)、PARALLEL(並行掃描)等提示進一步鎖定計畫。SELECT /*+ ORDERED_PREDICATES */
*
FROM large_table
WHERE expensive_plsql_func(col1) = 'Y' -- 想最後算
AND col2 = 100 -- 想最先算(高選擇性)
AND col3 > SYSDATE - 30; -- 中等選擇性
該隱含參數控制優化器評估的最大連接順序排列數。默認值 5,意味著表數 ≤ 5 時全量枚舉,>5 時啟發式搜索(贪婪/動態規劃)。
當查詢表數 < optimizer_search_limit 時,STAR 提示(星型查詢轉換)生效。調整此參數會間接影響星型查詢優化決策。
ALTER SESSION SET optimizer_search_limit = 8; -- 會話級調整,不影響全局
SELECT /*+ ORDERED ORDERED_PREDICATES USE_HASH(f) PARALLEL(s, 4) */
s.store_name, SUM(f.sales_amt)
FROM stores s, facts f, dates d, products p
WHERE s.store_id = f.store_id
AND f.date_id = d.date_id
AND f.prod_id = p.prod_id
AND d.year = 2024
AND p.category = 'Electronics'
AND s.region = 'East'
GROUP BY s.store_name;
optimizer_search_limit,避免全局副作用。ORDERED 鎖定連接順序(驅動表:stores → dates → products → facts)。ORDERED_PREDICATES 確保高選擇性過濾(year、category、region)優先求值。USE_HASH/PARALLEL 鎖定連接方式與並行度。EXPLAIN PLAN / SQL Trace / DBMS_XPLAN 對比提示前後代價、行數、操作。