網絡、硬件、OS 往往不可變,應用代碼難改 → 重點優化資料庫配置與數據結構,建立良好基線,再針對慢 SQL 微調。
原則:留足 OS 與其他進程內存,32 位系統 SGA 上限 1.75GB(部分可突破)。
| 物理內存 | 建議 SGA | Shared Pool | DB Cache (Buffer Cache) | 備註 |
|---|---|---|---|---|
| 512 MB | ~240 MB | 60~80 MB | 120~150 MB | 小型應用,8i 用 DB_BLOCK_BUFFERS,9i+ 用 DB_CACHE_SIZE |
| 1 GB | ~500 MB | 100~150 MB | 300~400 MB | 中型核心業務 |
| 2 GB | ~1.2 GB | 300~500 MB | 剩餘 | 大型 OLTP |
| >2 GB | 視情況 | 300~500 MB 封頂 | 盡可能大 | Shared Pool 過大反增 Latch 競爭;32位注意 1.75G 限制 |
關鍵參數:SHARED_POOL_SIZE、DB_CACHE_SIZE(9i+)、LARGE_POOL_SIZE(並行/備份/共享服務器)、JAVA_POOL_SIZE、STREAMS_POOL_SIZE。
默認 OPTIMIZER_MODE = CHOOSE:表無統計 → RBO(全表掃描多);表有統計 → CBO。同一 SQL 在測試/生產產生截然不同計劃,極不穩定。
EXEC DBMS_STATS.GATHER_DATABASE_STATS(options => 'GATHER AUTO');
或按表:ANALYZE TABLE tab COMPUTE STATISTICS;(10g+ 推薦 DBMS_STATS)。ESTIMATE PERCENT 10(不可過低,否則統計失真)。SELECT table_name, last_analyzed FROM dba_tables WHERE owner = 'SCOTT';
ALTER SYSTEM SET OPTIMIZER_MODE = ALL_ROWS SCOPE=BOTH;(或 FIRST_ROWS_10),徹底禁用 CHOOSE。-- 環境:表 CASE_GA_AJZLZ 約 35 萬行,有主鍵
SQL> SET AUTOTRACE ON
SQL> SET TIMING ON
-- 收集前(假設無統計,CHOOSE 退化為 RBO)
SQL> SELECT COUNT(*) FROM CASE_GA_AJZLZ;
-- 計劃:TABLE ACCESS FULL,Cost 高,耗時長
-- 收集統計
EXEC DBMS_STATS.GATHER_TABLE_STATS('OWNER', 'CASE_GA_AJZLZ');
-- 收集後
SQL> SELECT COUNT(*) FROM CASE_GA_AJZLZ;
-- 計劃:INDEX FAST FULL SCAN (PK),Cost 大幅降低,耗時秒級
使用 SQL Plan Management (SPM) 或 Stored Outlines 固化核心業務 SQL 計劃,防止統計信息波動導致計劃突變。
文中提及的附件腳本可自動輸出 SGA 配置、緩存命中率、等待事件、Top SQL 等關鍵指標,建議納入巡檢體系。