CBO 支援星型連結、Hash Join、分區表、平行查詢等現代特性,**Oracle 10g+ 預設僅支援 CBO**,RBO 已棄用。
| 方法 | 指令範例 | 特點 | 適用場景 |
|---|---|---|---|
| 完全計算 | ANALYZE TABLE abc COMPUTE STATISTICS; | 全表掃描,精準但耗時、鎖表久 | 小表、需精確統計、維護窗口充足 |
| 抽樣估算 | ANALYZE TABLE abc ESTIMATE STATISTICS SAMPLE 20 PERCENT; | 快、低影響,精度足夠 | 大表、生產環境常態維護 |
建議:表用抽樣(20%~30%),索引可完全計算(索引較小)。
# analyze.sh
sqlplus scott/tiger <
crontab -e 加入 0 2 1 * * /home/oracle/analyze.sh(每月 1 號凌晨 2 點)。
DBMS_DDL.ANALYZE_OBJECT(
type => 'TABLE', schema => 'SCOTT', name => 'EMP',
method => 'ESTIMATE', estimate_percent => 50
);
針對單一物件(TABLE/INDEX/CLUSTER)。
DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT', 'ESTIMATE', NULL, 20);
DBMS_UTILITY.ANALYZE_DATABASE('ESTIMATE', NULL, 20);
分別處理單一 Schema 或整庫所有物件。
GATHER_TABLE_STATS、GATHER_INDEX_STATS、GATHER_SCHEMA_STATS、GATHER_DATABASE_STATS-- 排程 Job 範例:每月對 SCOTT Schema 抽樣 20%
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'DBMS_UTILITY.ANALYZE_SCHEMA(''SCOTT'',''ESTIMATE'',NULL,20);',
SYSDATE, 'SYSDATE+30');
COMMIT;
END;
/
AUTO_TASKS 內建 GATHER_STATS_JOB,每晚維護窗口自動執行,**保持啟用**。INCREMENTAL => TRUE,僅掃描變更分區,合併全域統計。METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO',讓 Oracle 依欄位偏態自動建立。LOCK_TABLE_STATS),防止計畫突變。EXPORT_TABLE_STATS/IMPORT_TABLE_STATS 複製統計至測試環境,重現計畫。SELECT table_name, last_analyzed, num_rows, blocks
FROM user_tables
WHERE stale_stats = 'YES'; -- 10g+ 顯示是否過期
統計資訊是 CBO 的「眼睛」。從手工 ANALYZE 到 DBMS_STATS 再到自動化任務,核心目標一致:**及時、精準、低衝擊**。建立「自動為主、手工補充、鎖定關鍵、定期稽核」的統計治理體系,是穩定 SQL 效能的長效機制。