首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 表空間碎片整理與效能調優:COALESCE、PCTINCREASE、SHRINK SPACE 綜合實戰

     編輯:Oracle 資料庫基礎

碎片成因與危害

  • 頻繁 `INSERT/DELETE/UPDATE` 導致 Extent 碎片化、空閒空間分散。
  • HWM 不下降,全表掃描讀取大量空塊,I/O 放大、緩存污染。
  • Extent 分配/釋放頻繁引發 `ST` 鎖爭用、字典緩存壓力。

四大整理手段對比

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 變大

效能調優關聯動作

  1. 統計資訊同步更新:Shrink 後必須 `DBMS_STATS.GATHER_TABLE_STATS(..., CASCADE=>TRUE)`,否則 CBO 仍按舊統計產生錯誤計畫。
  2. 檢查連鎖行:`ANALYZE TABLE t LIST CHAINED ROWS`,若大量鏈行需 `ALTER TABLE t MOVE` (離線) 或重建。
  3. 調整 PCTFREE:重建/收縮時可同步 `ALTER TABLE t PCTFREE 20` 預留更新空間,減少未來行遷移。

避坑清單

手段指令層級線上/離線效果適用場景
表空間合併`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 增長新建表空間或重新規劃時
操作風險規避
直接 `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` 監控儀表板,將碎片治理從「救火」轉為「常態化管控」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved