在 Oracle 9i 之前,表的剩餘空間管理依賴連接列表,即 Freelist。Freelist 存在串行瓶頸,易導致段頭爭用與空間浪費,且 DBA 需投入大量精力監控空間利用率。自 Oracle 9.2.0 起,引入自動段空間管理,以位圖取代 Freelist,實現對存儲擴展與空閒塊的高效管理,顯著改善段存儲本質。採用 ASSM 的表空間所建段稱為位圖管理段。
CREATE TABLESPACE demo
DATAFILE '/ora01/oem/demo01.dbf' SIZE 5M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
建立後,PCTUSED、NEXT、FREELISTS 等參數將被忽略;INITIAL 仍需指定(最小 3 個塊)。位圖以四種狀態(>75%、50-75%、25-50%、<25%)追蹤每塊剩餘空間,何時使用塊由 PCTFREE 決定。
建立測試表 demotab 並查看初始狀態:
SQL> exec show_space('demotab');
Total Blocks.............. 128
Unused Blocks............. 125
Last Used Block........... 3
表頭佔用 3 個塊(塊 9-11),實際數據從塊 9 開始(文件頭佔 8 塊)。透過 ALTER SYSTEM DUMP DATAFILE 分析三個關鍵塊:
type: 0x20=FIRST LEVEL BITMAP BLOCK
nbits: 4, nranges: 2
unformatted: 13, total: 16
0:Metadata 1:Metadata 2:Metadata 3:unformatted ... 15:unformatted
記錄 16 個塊的空間狀態,前 3 個為元數據(位圖塊與段頭),其餘 13 個未格式化。
type: 0x21=SECOND LEVEL BITMAP BLOCK
number: 8 nfree: 8
L1 Ranges:
0x06800009 Free: 5 Inst: 1
0x06800019 Free: 5 Inst: 1 -- 對應塊 25
0x06800029 Free: 5 Inst: 1 -- 對應塊 41
...
儲存第一級位圖塊的地址(DBA),每 16 塊產生一個第一級位圖塊,第二級塊負責索引它們,形成樹狀結構。
type: 0x23=PAGETABLE SEGMENT HEADER
Extent Map: 16 extents, 128 blocks
Highwater:: 0x0680000c ext#: 0 blk#: 3
Level 1 BMB for High HWM: 0x06800009
記錄區映射、高水位標記(HWM)及位圖塊層級指引。
插入 28,985 筆資料後,show_space 顯示已用 56 塊(7 個區)。DBMS_SPACE.SPACE_USAGE 統計:
Full Blocks = 43
FS4 Blocks (75-100% free) = 6
FS1 Blocks (0-25% free) = 1
Unformatted Blocks = 0
對應位圖塊轉储:
驗證:3×16 + 8 = 56 塊,完美吻合。
段頭記錄兩個 HWM:
ASSM 通過多層級位圖樹狀結構,將空間管理元數據分散在段內部,實現高並發、低爭用的自動空間管理。理解其塊結構與 HWM 機制,有助於深度診斷空間碎片、效能瓶頸及異常狀態。