核心差異一覽
| 特性 | Oracle(默認堆表) | DB2(默認聚簇索引表) |
| 數據存儲順序 | 無序(Heap) | 按聚簇索引鍵有序 |
| ROWID 穩定性 | 物理 ROWID 不變(行遷移留指針) | 物理位置變更時 ROWID 改變,Index Entry 同步更新 |
| 二級索引查找 | 邏輯 ROWID(主鍵 + 物理猜測) | 物理 ROWID 直接定位 |
| 聚簇維護 | 前端強制維序(IOT),更新性能較差 | 後端 REORG 定期重組,前端更新較快 |
Oracle 堆表與 IOT
- 堆表:插入位置由空間管理決定,普通 DML 不改變 ROWID。行長度增長導致空間不足時發生「行遷移」,原位置留 ROWID 指針指向新塊。
- 索引組織表(IOT):數據按主鍵順序存儲,更新可能導致行移動,ROWID 不穩定。二級索引使用邏輯 ROWID(主鍵 + 創建時的物理地址「物理猜測」)。物理猜測命中則一次 I/O,失敗則需掃描主鍵索引(多次 I/O)。
DB2 聚簇索引機制
- 只要表有索引,DB2 盡量按該索引鍵順序存儲(隱式聚簇)。
- 更新導致行長度增長無法原位容納時發生「Overflow」,原位置留指針指向新位置,可能形成指針鏈。
- 二級索引(非聚簇)同樣通過物理 ROWID 定位,不隨聚簇索引重組而改善聚簇比。
- 聚簇效率隨更新下降,需運行
REORG 實用程序重組數據頁。
二級索引查找效能對比
Oracle 邏輯 ROWID 包含「物理猜測」,創建時命中率高,但隨更新頻率增加,物理猜測失效率上升,被迫繞回主鍵索引掃描,增加 I/O。DB2 始終使用物理 ROWID 直接定位,無額外跳轉,但非聚簇索引的 RowID 分佈隨機,預讀效果較差。
結論與建議
- Oracle 依賴聚簇索引(主鍵)組織數據,二級索引通過主鍵回表,適合讀多寫少、主鍵訪問為主的場景。
- DB2 通過後端 REORG 維持聚簇,前端更新開銷小,適合高併發寫入、需範圍掃描的場景。
- 遷移時需重新評估索引策略、分區設計及維護窗口。