| 維度 | RBO (Rule-Based) | CBO (Cost-Based) |
|---|---|---|
| 依據 | 固定規則集(如索引優先) | 統計信息計算 Cost,取最低 |
| 數據敏感度 | 不敏感 | 高度依賴統計信息 |
| 新特性支援 | 無(星型查詢、哈希連接、並行查詢均需 CBO) | 全支援 |
| 維護狀態 | 已停止發展 | 持續演進 |
默認 OPTIMIZER_MODE=CHOOSE:有統計信息用 CBO,否則退回 RBO。
OPTIMIZER_MODE 非 RULE。WHERE UPPER(col)=... 導致索引失效,改用函數索引。char_col = 123 觸發 TO_NUMBER,同第 6 點。ANALYZE TABLE ... COMPUTE STATISTICS FOR ALL INDEXES 或 DBMS_STATS。METHOD_OPT=>'FOR COLUMNS SIZE 254 col')輔助決策。COUNT(*)、WHERE col IS NULL 不走索引(全空鍵值不存入 B*Tree)。<, >, LIKE)配合綁定變量可能導致計劃固化不佳。SELECT /*+ INDEX(a idx_col1) */ * FROM a WHERE col1 = :val;
注意:/*+ 緊跟 SELECT,無空格;否則視為普通註釋。
-- 建表腳本:$ORACLE_HOME/rdbms/admin/utlxplan.sql
SET AUTOTRACE ON
SELECT ...; -- 直接顯示計劃、Cost、連接方式、邏輯/物理讀
-- 1. 從 V$SESSION 獲取目標 SID, SERIAL#
-- 2. SYS 執行開啟跟蹤
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, TRUE);
-- 3. 運行業務,生成 user_dump_dest 下的 ora_.trc
-- 4. 關閉跟蹤
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(sid, serial#, FALSE);
-- 5. 分析
tkprof ora_.trc output.txt explain=user/pwd
輸出文件含每條 SQL 的計劃、CPU、邏輯讀、物理讀、耗時,快速定位性能瓶頸。