Oracle 8i 提供兩種優化器:
CBO 為 8i 預設且唯一持續增強方向,RBO 已不再更新。
init.ora 設定 OPTIMIZER_MODE = CHOOSE
ALTER SESSION SET OPTIMIZER_GOAL = FIRST_ROWS | ALL_ROWS
FIRST_ROWS:優化首筆回應時間(OLTP)ALL_ROWS:優化整體吞吐量(DSS/批次)SELECT /*+ CHOOSE */ ...
SELECT /*+ FIRST_ROWS */ ...
SELECT /*+ ALL_ROWS */ ...
CBO 完全依賴統計資訊準確性。統計過期、缺失、採樣不足會導致錯誤成本估算。必須定期執行:
ANALYZE TABLE table_name COMPUTE STATISTICS; -- 完整統計
ANALYZE TABLE table_name ESTIMATE STATISTICS SAMPLE 20 PERCENT; -- 採樣統計
-- 9i+ 建議使用 DBMS_STATS 套件
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCHEMA', 'TABLE', CASCADE=>TRUE);
| 原因 | 影響機制 | 對策 |
|---|---|---|
| OPTIMIZER_MODE 參數變更 | 切換 CBO/RBO 或 FIRST_ROWS/ALL_ROWS | 鎖定實例/Session 級參數,避免意外修改 |
| 並行查詢度變更 | 改變成本模型中的 CPU/IO 權重 | 謹慎使用 PARALLEL HINT/屬性 |
| 重新分析表(ESTIMATE 方式) | 不同採樣百分比產生不同統計值 | 固定採樣比例,或改用 COMPUTE/DBMS_STATS |
| DB_FILE_MULTIBLOCK_READ_COUNT 修改 | 影響全表掃描成本計算 | 依據儲存特性固定設定,勿頻繁調整 |
| SORT_AREA_SIZE 修改 | 影響排序/哈希連接成本估算 | 配合 PGA_AGGREGATE_TARGET 統一管理 |
DBMS_STATS 而非 ANALYZEDBMS_STATS.LOCK_TABLE_STATS 防止意外變更DBMS_STATS.EXPORT_SCHEMA_STATS 供回滾CREATE OUTLINE,11g+ 使用 SPMV$SQL_PLAN / DBA_HIST_SQL_PLAN-- 1. 確認優化器模式
SHOW PARAMETER OPTIMIZER_MODE;
-- 2. 檢查表統計狀態
SELECT table_name, last_analyzed, num_rows, blocks, sample_size
FROM user_tables WHERE table_name = 'YOUR_TABLE';
-- 3. 查看執行計畫
EXPLAIN PLAN FOR SELECT ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 4. 比較 Hint 前後計畫
EXPLAIN PLAN FOR SELECT /*+ FIRST_ROWS */ ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
CBO 是智慧引擎,統計資訊是其燃料。穩定的統計資訊 + 受控的參數變更 + 計畫基線管理 = 穩定的執行計畫 = 可預測的效能。調優非一次性動作,而是持續的統計治理與計畫監控流程。