隨著資料增長,大表空間碎片、索引膨脹、段擴散會嚴重拖慢查詢效能。本文深度解析四大防護支柱:範圍分區表/索引、索引重建策略、段碎片診斷與整理、自由區段合併機制,附完整語法、自動化腳本與監控指標。
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 employee_deptno 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 employee ADD PARTITION part5 VALUES LESS THAN (41) TABLESPACE part5_ts;
-- 合併分區
ALTER TABLE employee MERGE PARTITIONS part1, part2 INTO PARTITION part1_2;
-- 移動分區 (釋放碎片、更換表空間)
ALTER TABLE employee MOVE PARTITION part3 TABLESPACE new_ts UPDATE INDEXES;
-- 截斷分區 (快速清除歷史資料)
ALTER TABLE employee TRUNCATE PARTITION part1 DROP STORAGE;
-- 離線重建 (鎖表)
ALTER INDEX idx_name REBUILD;
-- 線上重建 (10g+ 企業版,不鎖表)
ALTER INDEX idx_name REBUILD ONLINE;
-- 指定表空間、壓縮、平行度
ALTER INDEX idx_name REBUILD TABLESPACE idx_ts COMPRESS 2 PARALLEL 4;
BEGIN
FOR idx IN (SELECT index_name FROM dba_indexes
WHERE owner = 'APP_OWNER' AND status = 'VALID')
LOOP
-- 簡單啟發式:葉子塊使用率低或高度>3
EXECUTE IMMEDIATE 'ALTER INDEX ' || idx.index_name || ' REBUILD ONLINE';
END LOOP;
END;
/
SELECT owner, segment_name, segment_type, extents, bytes/1024/1024 MB
FROM dba_segments
WHERE extents > 10 -- 經驗閾值
AND owner NOT IN ('SYS','SYSTEM')
ORDER BY extents DESC;
| 方案 | 適用場景 | 操作步驟 | 停機時間 |
|---|---|---|---|
| CREATE TABLE AS SELECT (CTAS) | 中小表、可容許短暫鎖表 | 1. CREATE TABLE new_t AS SELECT * FROM old_t; 2. DROP old_t; 3. RENAME new_t TO old_t; 4. 重建索引/授權/同義詞 | 秒~分鐘 |
| EXP/IMP (COMPRESS=Y) | 大表、跨表空間移動 | 1. EXP COMPRESS=Y; 2. DROP TABLE; 3. IMP | 分鐘~小時 |
| ALTER TABLE MOVE (10g+) | 單表、配合 ONLINE | ALTER TABLE t MOVE TABLESPACE ts UPDATE INDEXES; | 無 (ONLINE) |
| DBMS_REDEFINITION | 核心大表、零停機 | 建立暫存表 → 啟動重定義 → 同步 → 完成切換 | 無 |
| 指標 | 查詢來源 | 告警閾值 | 處理動作 |
|---|---|---|---|
| 表空間使用率 | DBA_TABLESPACE_USAGE_METRICS | > 85% | 擴容/清理/歸檔 |
| 索引葉子塊使用率 | ANALYZE INDEX ... VALIDATE STRUCTURE → INDEX_STATS | < 50% | REBUILD ONLINE |
| 段區段數 | DBA_SEGMENTS.EXTENTS | > 20 | MOVE/REDEFINITION |
| 最大自由區段 | DBA_FREE_SPACE.MAX(BYTES) | < 預估最大物件 | COALESCE/擴容 |
建立「分區隔離、索引重建、段整理、區段合併」四位一體的效能防護體系,讓大型資料庫長期保持最佳狀態。