Data Block (資料區塊) 是 Oracle 儲存管理的最小邏輯單位 (預設 8KB)。理解其內部結構是效能調優、空間管理、損壞恢復的基礎。
+--------------------------+
| Block Header (標頭) | ← 固定 + 可變部分
| - Block Address |
| - Segment Type |
| - SCN / Flags |
+--------------------------+
| Table Directory (表目錄) | ← 此區塊屬於哪些表
+--------------------------+
| Row Directory (行目錄) | ← 每行在區塊內的位移 (Slot)
| Slot 0 → Offset 120 |
| Slot 1 → Offset 250 |
| ... |
+--------------------------+
| Free Space (可用空間) | ← 向下增長
| |
+--------------------------+
| Row Data (行資料區) | ← 向上增長
| Row Piece 1 |
| Row Piece 2 |
| ... |
+--------------------------+
| 組件 | 內容 | 關鍵特性 |
|---|---|---|
| Block Header | 區塊地址、段類型、SCN、交易槽 (ITL) | 固定 ~107 bytes;ITL 初始由 INITRANS 決定,動態擴展受 MAXTRANS (11g+ 已忽略) 限制 |
| Table Directory | 儲存於此區塊的表物件 ID | Cluster 表共用區塊時有多條目 |
| Row Directory | Slot 陣列,指向 Row Data 位移 | **刪除行不回收 Slot**,空間洩漏來源;ANALYZE ... LIST CHAINED ROWS 可檢測 |
| Free Space | Row Directory 末端 到 Row Data 起始之間 | INSERT/UPDATE 擴展時消耗;PCTFREE 保留比例 |
| Row Data | 實際行資料 (含欄位長度、資料、NULL 標記) | Row Piece 可能跨區塊 (Row Chaining/Migration) |
CREATE TABLE t (...) PCTFREE 20 PCTUSED 40;
CREATE TABLESPACE tbs DATAFILE '...' EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
| 現象 | 原因 | 影響 | 解決 |
|---|---|---|---|
| Row Chaining | 單行 > 區塊大小 (LONG/LOB/超多欄位) | 跨區塊讀取,I/O 翻倍 | 避免超寬表、LOB 獨立儲存、增大區塊 (16K/32K) |
| Row Migration | UPDATE 導致行膨脹超過區塊剩餘空間 | 原位留 Forwarding Address,額外 I/O | 適當 PCTFREE、定期 ALTER TABLE ... MOVE 整理 |
-- 區塊大小
SHOW PARAMETER db_block_size;
-- 表平均行長度、鏈遷移統計
ANALYZE TABLE t LIST CHAINED ROWS;
SELECT * FROM chained_rows;
-- 區塊層級自由空間 (需 SYS)
SELECT * FROM dba_free_space WHERE tablespace_name = 'TBS';
吃透區塊結構、ITL、PCTFREE、ASSM、鏈遷移,儲存層調優不再盲目。