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

Oracle 表空間碎片整理:原理、評估與實戰方案

     編輯:Oracle 資料庫基礎

碎片如何產生

Oracle 採用「優先使用最大自由區塊」的空間分配策略。隨著段的反覆建立、擴展、刪除,表空間內會產生大量離散、細小的自由區塊,形成「自由空間碎片」。此外,段內部因行遷移、刪除操作導致區塊利用率低下,形成「段碎片」。

碎片的危害

  • 效能下降:尋找足夠大的連續自由區塊耗時增加,空間分配遠離最佳狀態。
  • 空間浪費:雖然 SMON 會定期合併相鄰自由區塊(pctincrease > 0 時),但非相鄰碎片無法自動合併,導致大量可用空間無法被大物件使用。

量化指標:FSFI (Free Space Fragmentation Index)

FSFI = 100 × √(最大區塊/區塊總和) × 1/⁴√(區塊數量)

  • 最大值 100(單一區塊的理想表空間)。
  • 區塊數量增加 → FSFI 緩慢下降;最大區塊縮小 → FSFI 驟降。
  • 經驗值:FSFI > 30 且有足夠自由空間時,碎片問題較輕微;接近閾值應排程整理。

FSFI 計算腳本

column FSFI format 999.99
select tablespace_name,
       sqrt(max(blocks)/sum(blocks)) * (100/sqrt(sqrt(count(blocks)))) FSFI
from dba_free_space
group by tablespace_name
order by 1;

自由區塊碎片整理方案

1. 啟用 SMON 自動合併

alter tablespace <tablespace_name> default storage (pctincrease 1);

設定 pctincrease 為非零值(建議 1),SMON 會定期合併相鄰自由區塊。

2. 手動合併

alter tablespace <tablespace_name> coalesce;

立即合併相鄰自由區塊,不影響業務讀寫。

3. 自動化排程腳本範例

sqlplus / as sysdba <

段碎片整理方案

當段擁有過多離散區塊(查詢 dba_segments/dba_extents 確認)時,採用「匯出/匯入重建」法:

  1. exp user/pass file=seg.dmp compress=y grants=y indexes=y tables=(t1,t2)
    compress=y 會將初始區塊設為該段總大小,匯入時自動合併為單一大區塊。
  2. 刪除原表(或改名備份)。
  3. imp user/pass file=seg.dmp commit=y buffer=64000 full=y

適用於整個資料庫或特定大表,需預留足夠停機窗口與暫存空間。

最佳實踐建議

  • 採用本地管理表空間(LMT)+ 自動區塊大小分配(ASSM),從源頭減少碎片產生。
  • 統一區塊大小(如 1M 均勻區塊),避免多種區塊大小混用。
  • 定期監控 FSFI,結合 dba_free_space 趨勢分析,制定整理排程。
  • 段整理優先針對高頻 DML、行遷移嚴重的大表;低頻小表可忽略。
  • 整理操作建議在業務低峰期執行,並驗證備份可用性。

碎片整理是資料庫維護的常態工作,而非一次性專案。建立監控指標、自動化腳本與變更流程,才能長期維持儲存層健康。

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