SQL 執行計劃的優劣直接決定查詢性能,而優化器模式的選擇是首要決策。本文系統梳理 Oracle 三大優化器特性、適用場景與配置最佳實踐。
| 模式 | 全稱 | 核心機制 | 適用場景 |
|---|---|---|---|
| RULE | 基於規則 | 固定規則集,不依賴統計信息 | 舊版本遷移、統計信息缺失環境 |
| COST (CBO) | 基於成本 | 依據對象統計信息計算執行成本 | 現代生產環境首選,需定期 ANALYZE |
| CHOOSE | 選擇性 | 有統計信息用 CBO,無則用 RULE | 過渡期預設值,易產生不穩定計劃 |
優化器模式可在三個層級設定,優先級遞增:
init.ora 設定 OPTIMIZER_MODE = CHOOSE | RULE | COST | ALL_ROWS | FIRST_ROWSALTER SESSION SET OPTIMIZER_MODE = .../*+ RULE */、/*+ FIRST_ROWS */ 等預設 CHOOSE 模式極易導致「部分表有統計、部分無」的混合場景,產生非最優計劃(如非預期全表掃描)。生產環境建議顯式指定 RULE 或 COST,並配合定時 ANALYZE / DBMS_STATS 維護統計信息。
DB_FILE_MULTIBLOCK_READ_COUNT)優化吞吐,適合大比例數據檢索。Oracle 將解析後的 SQL 存放於 SGA 的 Shared Pool,實現游標複用,減少硬解析開銷。
SELECT * FROM EMP; ≠ SELECT * from EMP; ≠ Select * From Emp;:blk1.pin vs :blk1.ot_ind 視為不同語句在 init.ora 設定適當 SHARED_POOL_SIZE:空間越大,可緩存語句越多,命中率越高。但需平衡記憶體總量,避免換頁。