首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 資料區塊內部結構深度解讀

     編輯:Oracle 資料庫相關知識

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)

PCTFREE / PCTUSED 空間管理機制 (手動管理表空間)

CREATE TABLE t (...) PCTFREE 20 PCTUSED 40;
  • PCTFREE 20:保留 20% 空間給 UPDATE 膨脹,INSERT 僅能使用前 80%。
  • PCTUSED 40:區塊使用率降至 40% 以下才重新加入 Freelist 供 INSERT 使用。
  • 循環:INSERT 填滿至 80% → UPDATE 使用保留區 → DELETE 釋放空間 → 使用率跌破 40% → 回 Freelist → 新 INSERT 使用。

自動段空間管理 (ASSM) — 現代標準

CREATE TABLESPACE tbs DATAFILE '...' EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
  • 以 **Bitmap** 取代 Freelist 追蹤區塊可用空間。
  • 優勢:無 PCTFREE/PCTUSED 調優負擔、多實例 (RAC) 競爭極低、空間利用率更高。
  • **所有新建表空間強烈建議 ASSM**。

Row Chaining vs Row Migration

現象原因影響解決
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、鏈遷移,儲存層調優不再盲目。

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