首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 精確計算 Row 大小的四步驟法

     編輯:Oracle 資料庫基礎

步驟 1:計算 Block Header 空間 (hsize)

hsize = DB_BLOCK_SIZE - KCBH - UB4 - KTBBH - ((INITRANS - 1) * KTBIT) - KDBH
  • DB_BLOCK_SIZE: 從 V$PARAMETER 取得。
  • KCBH, UB4, KTBBH, KTBIT, KDBH: 常數,從 V$TYPE_SIZE 查詢。
  • INITRANS: 從 USER_TABLES.INI_TRANS 取得。

步驟 2:計算每 Block 可用資料空間 (availspace)

availspace = CEIL(hsize * (1 - PCTFREE/100)) - KDBT
  • CEIL: 取大於等於該值的最小整數。
  • PCTFREE: 從 USER_TABLES.PCT_FREE 取得。
  • KDBT: 常數,從 V$TYPE_SIZE 取得 (無則用 UB4 代替)。

步驟 3:計算每 Row 空間 (rowspace)

  1. 欄位大小含長度位元組:column_size + (1 if column_size < 250 else 3)。可用 SELECT avg(vsize(col)) FROM table 估算。
  2. Row 大小:rowsize = 3*UB1 + SUM(欄位大小)。
  3. 最終 Row 空間:rowspace = MAX(UB1*3 + UB4 + SB2, rowsize) + SB2。UB1, UB4, SB2 為常數 (查 V$TYPE_SIZE)。

若 Row 空間超過可用空間但小於 PCTFREE 保留空間,仍存單一 Block;若超過且無保留空間,則發生 Row Chaining,效能下降。

步驟 4:計算每 Block 最大筆數

rows_per_block = FLOOR(availspace / rowspace)

FLOOR 取小於等於該值的最大整數。此為估算值,實際建表時 INITIAL 儲存參數建議預留更多空間。

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