複雜查詢的解析優化往往比執行優化更關鍵。本文介紹三種減少解析開銷、加速SQL執行的實用技術:ORDERED提示、ORDERED_PREDICATES提示、限制表連接評估數量。
問題:多表連接時,優化器需評估所有連接順序排列組合(8表超4萬種),解析耗時可達30分鐘。
方案:ORDERED提示強制按FROM子句順序連接,首表為驅動表(應選返回行數最少的表)。
SELECT /*+ ORDERED USE_NL(bonus) PARALLEL(e, 4) */
e.ename, hiredate, b.comm
FROM emp e, bonus b
WHERE e.ename = b.ename;
效果:跳過昂貴的連接順序枚舉,強制嵌套循環+並行查詢組合,顯著縮短解析時間。
默認規則:
ORDERED_PREDICATES作用:強制按WHERE子句書寫順序評估謂詞。
限制:不可用於控制索引鍵評估順序。
參數作用:控制基於成本優化器(CBO)評估的最大連接組合數。
默認值:5
效果:防止優化器過度枚舉連接順序,平衡解析時間與執行計劃質量。
副作用:當查詢表數少於該值時,STAR提示自動啟用。
ALTER SESSION SET optimizer_search_limit = 10; -- 適度放寬
-- 或系統級
ALTER SYSTEM SET optimizer_search_limit = 10 SCOPE=BOTH;
三大技巧針對解析階段不同痛點:ORDERED解決連接順序枚舉爆炸,ORDERED_PREDICATES解決謂詞評估順序不可控,optimizer_search_limit解決優化器搜索空間過大。實戰中應結合SQL Profile、基線管理、統計信息收集等手段,構建系統級SQL性能保障體系。