大型 Oracle 資料庫效能下降常源於三大根因:大表全掃描、索引膨脹、儲存碎片。本文提供分區表設計、索引重建策略、段與自由區碎片整理的完整實操指南,附 DDL 範例與自動化建議。
CREATE TABLE employee (
empno VARCHAR2(10) PRIMARY KEY,
name VARCHAR2(30),
deptno NUMBER(2)
)
PARTITION BY RANGE (deptno) (
PARTITION part1 VALUES LESS THAN (11) TABLESPACE part1_ts,
PARTITION part2 VALUES LESS THAN (21) TABLESPACE part2_ts,
PARTITION part3 VALUES LESS THAN (31) TABLESPACE part3_ts,
PARTITION part4 VALUES LESS THAN (MAXVALUE) TABLESPACE part4_ts
);
優勢:分區裁剪、獨立備份/恢復、分區級匯入匯出、分區交換載入。
CREATE INDEX emp_deptno_idx ON employee(deptno) LOCAL (
PARTITION part1 TABLESPACE part1_ndx_ts,
PARTITION part2 TABLESPACE part2_ndx_ts,
PARTITION part3 TABLESPACE part3_ndx_ts,
PARTITION part4 TABLESPACE part4_ndx_ts
);
ALTER TABLE ... MOVE PARTITION 自動同步)-- 新增分區
ALTER TABLE employee ADD PARTITION part5 VALUES LESS THAN (41) TABLESPACE part5_ts;
-- 刪除分區 (數據同步刪除)
ALTER TABLE employee DROP PARTITION part1;
-- 交換分區 (極速載入/歸檔)
ALTER TABLE employee EXCHANGE PARTITION part2 WITH TABLE staging_emp INCLUDING INDEXES;
-- 移動分區 (換表空間/壓縮)
ALTER TABLE employee MOVE PARTITION part3 TABLESPACE part3_ts COMPRESS;
-- 截斷分區 (保留結構)
ALTER TABLE employee TRUNCATE PARTITION part4;
頻繁 DELETE/INSERT 導致索引葉塊產生大量「已刪除標記」項目,空間不釋放,掃描效率下降,High Water Mark 持續推高。
ALTER INDEX emp_deptno_idx REBUILD ONLINE;
-- 或指定表空間、壓縮
ALTER INDEX emp_deptno_idx REBUILD ONLINE TABLESPACE idx_ts COMPRESS 1;
SELECT * FROM dba_indexes WHERE last_analyzed < SYSDATE - 7V$SESSION_LONGOPS 確認進度SELECT owner, segment_name, segment_type, extents
FROM dba_segments
WHERE extents >= 10
ORDER BY extents DESC;
Extent 數 ≥ 10 且效能異常者優先處理。
| 方法 | 步驟 | 優點 | 缺點 |
|---|---|---|---|
| CTAS + 重建 | CREATE TABLE new_t AS SELECT * FROM old_t; DROP old_t; RENAME new_t TO old_t; | 可調整存儲參數、壓縮 | 需鎖表、外鍵/權限/同義詞需重建 |
| EXP/IMP (compress=Y) | exp compress=Y → drop → imp | 自動重組 Extent、可跨版本 | 耗時長、需停機窗口 |
段釋放後形成自由區,若 PCTINCREASE = 0,SMON 不自動合併,導致「總免費空間大但最大連續自由區小」的假象,新 Extent 分配失敗。
ALTER TABLESPACE users COALESCE;
-- 或特定數據文件
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' RESIZE 2G; -- 觸發合併
PCTINCREASE > 0 (如 10) 讓 SMON 定期自動合併DBA_SEGMENTS,CTAS 整理 Extents > 20 的段PCTINCREASE=10,每季執行 COALESCE持續執行「三板斧」,可將大型 Oracle 系統效能穩定在最佳狀態,延緩硬體擴容週期。