資料庫效能退化多源於「I/O 熱點、索引膨脹、段碎片、自由空間碎片」四大根因。本文系統闡述 Oracle 透過分區表、索引重建、段碎片整理、自由區塊合併四大技術支柱,維持長期穩定效能的實作細節與排程策略。
CREATE TABLE employee (
emp_no VARCHAR2(10) PRIMARY KEY,
name VARCHAR2(30),
dept_no NUMBER(2)
)
PARTITION BY RANGE (dept_no) (
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 employee_dept_no ON employee(dept_no) 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 INDEX ... REBUILD PARTITION),不影響其他分區可用性。UPDATE GLOBAL INDEXES)。-- 新增分區
ALTER TABLE employee ADD PARTITION part5 VALUES LESS THAN (41) TABLESPACE part5_ts;
-- 刪除分區(資料同步刪除)
ALTER TABLE employee DROP PARTITION part1 UPDATE GLOBAL INDEXES;
-- 截斷分區(保留結構,極快)
ALTER TABLE employee TRUNCATE PARTITION part1;
-- 移動分區(換表空間/壓縮)
ALTER TABLE employee MOVE PARTITION part2 TABLESPACE new_ts COMPRESS;
-- 分割分區
ALTER TABLE employee SPLIT PARTITION part4 AT (35) INTO (
PARTITION part4a TABLESPACE part4a_ts,
PARTITION part4b TABLESPACE part4b_ts
);
-- 合併分區
ALTER TABLE employee MERGE PARTITIONS part1, part2 INTO PARTITION part12 TABLESPACE part12_ts;
頻繁 DML 導致索引葉子塊產生大量「已刪除但未回收」項目,索引體積膨脹、掃描效率下降。
ALTER INDEX idx_name REBUILD ONLINE; 不鎖表,適合 7x24 系統。ALTER INDEX idx_name REBUILD PARALLEL 4; 大索引加速。INDEX_STATS 視圖的 HEIGHT、LF_BLKS、DEL_LF_ROWS / LF_ROWS > 20% 即考慮重建。BEGIN
FOR rec IN (
SELECT index_name, owner
FROM dba_indexes
WHERE owner = 'SCOTT'
AND index_type = 'NORMAL'
) LOOP
EXECUTE IMMEDIATE 'ALTER INDEX '||rec.owner||'.'||rec.index_name||' REBUILD ONLINE PARALLEL 4';
END LOOP;
END;
/
段由多個不連續區塊組成,超過 10 個區塊即視為碎片化,導致:
SELECT owner, segment_name, segment_type, extents
FROM dba_segments
WHERE extents >= 10
ORDER BY extents DESC;
CREATE TABLE new_t NOLOGGING PARALLEL 4 AS SELECT * FROM old_t;
DROP TABLE old_t;
RENAME new_t TO old_t;
-- 重建索引、授權、約束
exp system/manager file=exp.dmp compress=Y grants=Y indexes=Y tables=(T1,T2)
-- 刪除原表
imp system/manager file=exp.dmp commit=Y buffer=64000 full=Y
compress=Y 讓匯出時重設儲存參數,匯入時自動合併為單一區塊。
段釋放後形成自由區塊,若 PCTINCREASE = 0,SMON 不會自動合併相鄰自由區塊,導致:
-- 表空間層級
ALTER TABLESPACE users COALESCE;
-- 特定資料檔
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/users01.dbf' RESIZE 2G; -- 觸發隱性合併
INITIAL = NEXT,PCTINCREASE = 0,MINEXTENTS = 1)。COALESCE + 監控 DBA_FREE_SPACE 最大區塊大小佔比。| 任務 | 頻率 | 執行窗口 | 備註 |
|---|---|---|---|
| 高活躍索引重建 | 每週 | 維護窗口 | 配合 DBMS_SCHEDULER |
| 段碎片檢測 | 每月 | 業務低峰 | extents >= 10 產生報表 |
| 表空間 COALESCE | 每月 | 業務低峰 | PCTINCREASE=0 表空間必做 |
| 分區表維護 | 依業務 | 變更窗口 | 新增/歸檔/截斷分區 |
將上述四大支柱納入「資料庫健康度儀表板」,設定閾值告警(如:最大自由區塊 < 100MB、索引刪除比 > 20%、段區塊數 > 50),從被動救火轉為主動預防,讓 Oracle 效能真正實現「長青」。