| 手段 | 指令 | 層級 | 線上/離線 | 效果 | 適用場景 |
| 表空間合併 | `ALTER TABLESPACE ts COALESCE;` | 表空間 | 線上 (短暫 ST 鎖) | 合併相鄰空閒 Extent,不移動段 | 碎片化輕微、定期維護 |
| 段收縮 | `ALTER TABLE t SHRINK SPACE [COMPACT];` | 段 (表/索引) | 線上 (需 ROW MOVEMENT) | 移動行、降 HWM、釋放 Extent 回表空間 | 大量 DELETE 後、大表分批 |
| 匯出/重建 | `EXP/IMP` 或 `Data Pump` | 段 | 離線 (需獨佔鎖) | 徹底重建、最乾淨 | 極度碎片、結構變更、跨平台遷移 |
| 調整 PCTINCREASE | `ALTER TABLESPACE ts STORAGE (PCTINCREASE 1);` | 表空間預設儲存參數 | 線上 (僅影響後續分配) | 啟用 SMON 自動合併、避免幾何級 Extent 增長 | 新建表空間或重新規劃時 |
PCTINCREASE 深度解析
- 0**:SMON **不** 自動合併空閒 Extent,必須手工 `COALESCE`。
- >0 (建議 1)**:SMON 定期 (約 12 小時) 自動合併相鄰空閒 Extent,**防止碎片累積**。
- 大數值 (如 50)**:Extent 大小呈幾何級數增長 (1M → 1.5M → 2.25M...),極易造成空間浪費與分配失敗,**嚴禁用於生產表空間**。
- 與 AUTOEXTEND 無關**:表空間自動擴展由 `AUTOEXTEND ON NEXT n` 控制,線性增長,不受 PCTINCREASE 影響。
實戰操作序列 (推薦組合拳)
-- 1. 表空間層面:合併碎片 + 啟用自動合併
ALTER TABLESPACE users COALESCE;
ALTER TABLESPACE users STORAGE (PCTINCREASE 1);
-- 2. 核心大表層面:分批 SHRINK (配合維護窗口)
-- 2.1 先 COMPACT 整理塊內空間 (無 HWM 鎖,業務高峰可做)
ALTER TABLE big_table ENABLE ROW MOVEMENT;
ALTER TABLE big_table SHRINK SPACE COMPACT;
-- 2.2 維護窗口正式收縮 (短暫鎖定)
ALTER TABLE big_table SHRINK SPACE;
ALTER TABLE big_table DISABLE ROW MOVEMENT;
-- 3. 同步收縮索引
ALTER INDEX big_table_pk SHRINK SPACE;
-- 其他索引同理
-- 4. 驗證效果
SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space WHERE tablespace_name='USERS' GROUP BY tablespace_name;
-- 觀察 Free Space 回升、最大連續 Free Extent 變大
效能調優關聯動作
- 統計資訊同步更新:Shrink 後必須 `DBMS_STATS.GATHER_TABLE_STATS(..., CASCADE=>TRUE)`,否則 CBO 仍按舊統計產生錯誤計畫。
- 檢查連鎖行:`ANALYZE TABLE t LIST CHAINED ROWS`,若大量鏈行需 `ALTER TABLE t MOVE` (離線) 或重建。
- 調整 PCTFREE:重建/收縮時可同步 `ALTER TABLE t PCTFREE 20` 預留更新空間,減少未來行遷移。
避坑清單
| 操作 | 風險 | 規避 |
| 直接 `SHRINK SPACE` 大表 | 長事務、Undo 爆滿、Snapshot Too Old | 先 `COMPACT`,維護窗口分批 `SHRINK` |
| 字典管理表空間 (DMT) 用 COALESCE | 無效,DMT 不支援 | 確認 `DBA_TABLESPACES.EXTENT_MANAGEMENT = LOCAL` |
| PCTINCREASE 設大值 | Extent 幾何增長、空間碎片化加劇 | 統一設 1,或改用均勻 Extent (UNIFORM SIZE) |
| 忽略索引收縮 | 索引碎片更嚴重、佔用空間未釋放 | 同步 `ALTER INDEX ... SHRINK SPACE` |
結語
表空間碎片整理是 **「表空間 COALESCE + PCTINCREASE=1 自動合併」+「核心表 SHRINK SPACE 分批收縮」+「統計資訊同步」** 的組合拳。建立月度/季度自動化維護作業 (DBMS_SCHEDULER),配合 `DBA_FREE_SPACE` 監控儀表板,將碎片治理從「救火」轉為「常態化管控」。
- 上一篇文章: Oracle DELETE 後表空間不釋放問題:ANALYZE、EXP/IMP、SHRINK SPACE 三大解法實測
- 下一篇文章: Oracle 游標參數管理:查看與調整 OPEN_CURSORS 完整指南
Copyright ©
程式碼之家 All Rights Reserved