| 術語 | 全稱 | 核心作用 |
|---|---|---|
| Freelist | Free List | 管理段內可插入/更新數據的塊鏈表,LIFO 結構 |
| HWM | High Water Mark | 段已使用空間的高水位線,全表掃描讀取上限 |
| ASSM | Auto Segment Space Management | 9i+ 引入的位圖管理模式,替代傳統 Freelist |
| PCTFREE/PCTUSED | - | 控制塊進出 Freelist 的空間閾值參數 |
Tablespace → Segment → Extent → Block。Segment 首塊為 Segment Header,存儲:
Segment Header Dump 片段:
nfl=3, nfb=1, typ=1, nxf=0
SEG LST:: flg: USED lhd: 0x03c00233 ltl: 0x03c00233
SEG LST:: flg: USED lhd: 0x03c00234 ltl: 0x03c00234
HIGH WATER MARK: 0x020004d0 ext#:12 blk#:275 ext size:475
段創建時自動生成,單一公共池,所有進程競爭訪問,高併發下成為熱點。
通過 STORAGE (FREELISTS n) 創建 (n≥2)。進程根據 Oracle PID 映射:list_entry = (PID % NFL) + 1。分散競爭,提升 OLTP 插入吞吐,但可能導致空間碎片化、段擴展加快。
動態創建,事務提交前專用。DELETE/UPDATE 釋放空間且無現有 TxFL 時分配。Segment Header 容納上限:2K 塊 24 個、8K 塊 101 個、16K 塊 204 個。
_bump_highwater_mark_count (默認 5 塊) 批量格式化新塊,HWM 向前推進示例演變:
初始鏈: 10→24→45→46→65→80 (HWM=80)
INSERT 取塊24, 空間
全表掃描讀取 所有 HWM 以下塊,含空塊。大量 DELETE 後 HWM 不下移,導致:
空間浪費率公式:p = 1 - (有數據行的塊數 / HWM下總塊數)
-- Oracle 8/9/10g+ 獲取有數據行的塊數
SELECT COUNT(DISTINCT SUBSTR(ROWID,7,3)||SUBSTR(ROWID,10,6)) FROM schema.table;
CREATE OR REPLACE PROCEDURE show_space(
p_segname IN VARCHAR2, p_owner IN VARCHAR2 DEFAULT USER,
p_type IN VARCHAR2 DEFAULT 'TABLE', p_partition IN VARCHAR2 DEFAULT NULL) AS
l_free_blks NUMBER; l_total_blocks NUMBER; l_total_bytes NUMBER;
l_unused_blocks NUMBER; l_unused_bytes NUMBER;
l_last_used_ext_fid NUMBER; l_last_used_ext_bid NUMBER; l_last_used_block NUMBER;
PROCEDURE p(lbl VARCHAR2, num NUMBER) IS BEGIN
DBMS_OUTPUT.PUT_LINE(RPAD(lbl,40,'.')||num);
END;
BEGIN
DBMS_SPACE.FREE_BLOCKS(segment_owner=>p_owner, segment_name=>p_segname,
segment_type=>p_type, partition_name=>p_partition, freelist_group_id=>0,
free_blks=>l_free_blks);
DBMS_SPACE.UNUSED_SPACE(segment_owner=>p_owner, segment_name=>p_segname,
segment_type=>p_type, partition_name=>p_partition,
total_blocks=>l_total_blocks, total_bytes=>l_total_bytes,
unused_blocks=>l_unused_blocks, unused_bytes=>l_unused_bytes,
last_used_extent_file_id=>l_last_used_ext_fid,
last_used_extent_block_id=>l_last_used_ext_bid,
last_used_block=>l_last_used_block);
p('Free Blocks',l_free_blks); p('Total Blocks',l_total_blocks);
p('Total Bytes',l_total_bytes); p('Unused Blocks',l_unused_blocks);
p('Unused Bytes',l_unused_bytes); p('Last Used Ext FileId',l_last_used_ext_fid);
p('Last Used Ext BlockId',l_last_used_ext_bid); p('Last Used Block',l_last_used_block);
END;
/
EXEC show_space('EMP','SCOTT');
-- Segment Header Dump
ALTER SYSTEM DUMP DATAFILE 4 BLOCK 100;
-- Data Block Dump
ALTER SYSTEM DUMP DATAFILE 4 BLOCK 101;
關注字段:flg: O (On Freelist)、fnx (下一塊 DBA)、itc (ITL 槽位數)。
ALTER TABLE t1 DEALLOCATE UNUSED; -- 全部回收
ALTER TABLE t1 DEALLOCATE UNUSED KEEP 10M; -- 保留 10M
REUSE STORAGE 保留區段ENABLE ROW MOVEMENT; SHRINK SPACE COMPACT; SHRINK SPACE; (ASSM 表空間專用)SELECT * FROM V$WAITSTAT WHERE CLASS='data block';V$SESSION_WAIT P3=0/1014 為讀競爭,其他為修改競爭SELECT * FROM DBA_EXTENTS WHERE FILE_ID=:p1 AND :p2 BETWEEN BLOCK_ID AND BLOCK_ID+BLOCKS-1CREATE TABLE new_t ... STORAGE (FREELISTS 16 FREELIST GROUPS 4) (RAC 環境需多組)10g+ 新建表空間強制 ASSM (EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO)。存量對象可通過 DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL 遷移,或重建表至 ASSM 表空間。ASSM 以位圖替代 Freelist,自適應管理,消除手工調優負擔。