「調優目標單一:**減少 I/O**,特別是物理磁碟 I/O。磁碟存取比記憶體慢 10,000 倍。」
vmstat / sar -W 顯示大量 swap in/out原則:外部資源不足時,任何資料庫內部調優皆無效。先用 vmstat, top, glance, sar 確認 OS 層面健康。
若應用常透過 **主鍵索引範圍掃描** 讀取連續多列 (如 WHERE last_name LIKE 'B%'),將表資料按主鍵順序物理儲存,可將 100 次隨機 I/O 降為 3 次循序 I/O (1 次索引 + 2 次資料塊)。
SELECT clustering_factor, blocks, num_rows
FROM dba_indexes i
JOIN dba_tables t ON i.table_owner=t.owner AND i.table_name=t.table_name
WHERE i.index_name = 'PK_EMP';
-- clustering_factor ≈ blocks → 順序良好
-- clustering_factor ≈ num_rows → 順序混亂,適合重排序
CREATE TABLE emp_new TABLESPACE new_tbs AS SELECT * FROM emp ORDER BY empno;CREATE TABLE ... CLUSTERING BY LINEAR ORDER (empno) ... 自動維護大表索引範圍掃描查詢效能可提升 **3 倍以上**。
INDEX Hint、OPT_PARAM 調整開銷。ALTER TABLE small_t CACHE; (7) 或放入 KEEP pool (8+)。EXPLAIN PLAN,必要時 INDEX_COMBINE, INDEX_JOIN Hint 指定。V$SQL, AWR, ASH)EXPLAIN PLAN / DBMS_XPLAN.DISPLAY_CURSOR 分析計畫DBMS_STATS)ORDER BY, GROUP BY, DISTINCTCREATE INDEXMERGE JOINPGA 中 sort_area_size (手動) 或 PGA_AGGREGATE_TARGET (自動)LARGE_POOLTEMP 表空間磁碟排序,**慢 14,000 倍**PGA_AGGREGATE_TARGET (10g+ 自動管理)ORDER BY (應用層排序)PARALLEL 分散至多進程V$SORT_USAGE, V$SQL_WORKAREA 偵測磁碟排序| 參數 | 含義 | 調優導向 |
|---|---|---|
PCTFREE | 預留給更新的空間 % | 高更新表設高 (20-30),唯讀表設低 (5-10) |
PCTUSED | 使用率低於此 % 回 freelist | 高插入表設低 (20-30),快速回收空間 |
FREELISTS | 自由列表數量 | 並發插入高峰值 (如 20 併發 → FREELISTS 20) |
FREELIST GROUPS | RAC 實例數 | 僅 RAC 需設定,等於存取該表的實例數 |
PCTUSED → 空間重用好但 I/O 多;低 PCTUSED → 效能好但空間浪費。**取決於業務模式**PCTFREE 過低或 DB_BLOCK_SIZE 過小 → 行跨塊 → 額外 I/OFREELIST GROUPS = 實例數ASSM (Automatic Segment Space Management) 表空間,自動管理 freelist,參數多被忽略| 層面 | 關鍵動作 | 驗證指標 |
|---|---|---|
| OS/硬體 | CPU/記憶體/網路無瓶頸 | run queue < CPU, zero paging, low net latency |
| 物理設計 | Row resequencing, Partitioning, Clustering | clustering_factor ≈ blocks |
| SQL | 消除不必要 FTS, 索引最優, 聯結最優 | logical reads ↓, elapsed time ↓ |
| 排序 | PGA 足夠, 避免磁碟排序 | V$SORT_USAGE 磁碟排序 = 0 |
| 競爭 | PCTFREE/PCTUSED/FREELISTS 適配業務 | buffer busy waits ↓, enq: TX - index contention ↓ |
Oracle 調優是系統工程:**外部資源是地基、物理設計是骨架、SQL 是血肉、排序與競爭是神經**。依序打穩每一層,以「減少物理 I/O」為唯一北極星,才能在複雜負載下持續交付穩定效能。