Oracle 優化器分為規則基礎(RBO)與成本基礎(CBO)兩種。CBO 依賴統計資訊計算執行計畫成本,選擇最低成本路徑。本文詳細說明統計資訊的收集方式、DBMS 套件應用、排程自動化策略,助您確保 CBO 高效運作。
| 方式 | 語法 | 特點 |
|---|---|---|
| 完全計算 | ANALYZE TABLE abc COMPUTE STATISTICS; | 等同全表掃描,準確但耗時 |
| 抽樣估算 | ANALYZE TABLE abc ESTIMATE STATISTICS SAMPLE 20 PERCENT; | 速度快,適合大表,建議表用抽樣、索引用完全計算 |
sqlplus scott/tiger << EOF
SET PAGESIZE 5000
SET HEADING OFF
SPOOL ANALYTAB.SQL
SELECT 'ANALYZE TABLE SCOTT.' || TABLE_NAME || ' ESTIMATE STATISTICS SAMPLE 20 PERCENT;' FROM USER_TABLES;
SPOOL OFF
SPOOL ANALYIND.SQL
SELECT 'ANALYZE TABLE SCOTT.' || TABLE_NAME || ' ESTIMATE STATISTICS SAMPLE 20 PERCENT FOR ALL INDEXES;' FROM USER_TABLES;
SPOOL OFF
SPOOL ANALYZE.LOG
@ANALYTAB.SQL
@ANALYIND.SQL
SPOOL OFF
EXIT
EOF
配合 crontab 定期執行。
DBMS_DDL.ANALYZE_OBJECT:單一物件(表/索引/叢集)DBMS_UTILITY.ANALYZE_SCHEMA:某 Schema 所有物件DBMS_UTILITY.ANALYZE_DATABASE:全資料庫參數包含 METHOD(ESTIMATE/COMPUTE/DELETE)、ESTIMATE_PERCENT、METHOD_OPT 等。
DBMS_STATS.GATHER_TABLE_STATS
DBMS_STATS.GATHER_INDEX_STATS
DBMS_STATS.GATHER_SCHEMA_STATS
DBMS_STATS.GATHER_DATABASE_STATS
VARIABLE jobno NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:jobno,
'dbms_utility.analyze_schema(''SCOTT'',''ESTIMATE'',NULL,20);',
SYSDATE, 'SYSDATE+30');
COMMIT;
END;
/
-- 每 30 天對 SCOTT 所有物件進行 20% 抽樣分析
DBMS_STATS,並設定 DEGREE => DBMS_STATS.AUTO_DEGREE 啟用平行收集。