資料檔案頭塊保留大小、ROWID、資料檔案最大大小等資料庫限制的說明

還不算暈發表於2013-11-20
學習自EYGLE循序漸進ORACLE及官方文件。

本地管理表空間中設定不同大小的db_block_size時資料檔案頭保留空間對應如下:

db_block_size=2KB,檔案頭保留32個資料塊,即64KB。
db_block_size=4KB,檔案頭保留16個資料塊,即64KB。
db_block_size=8KB,檔案頭保留8個資料塊,即64KB。
db_block_size=16KB,檔案頭保留4個資料塊,即64KB。
db_block_size=32KB,檔案頭保留4個資料塊,即128KB。
預設是db_block_size=8KB,此時 ORACLE資料檔案頭的8個資料塊作用是:
資料塊1和2記錄資料檔案頭資訊。3-8用於記錄extent-區間的點陣圖資訊  --11G中要保留到128個塊???
################################

Oracle資料庫中的資料檔案的最大數量是有限的(通常64K檔案。--來自官方文件

表空間支援的最大資料檔案大小的演算法:

分兩種情況:smallfile tablespace與bigfile tablespace

smallfile tablespace的ROWID

記錄儲存所在資料檔案(file#),所屬資料庫物件,所在資料塊中的行號,這些屬性合併起來構成了ORACLE ROWID.
ORACLE ROWID分為物理ROWID,邏輯ROWID。
索引組織表(IOTs)使用邏輯ROWID,其它型別的表使用物理ROWID。
ROWID可以惟一標識一條記錄,所以索引中儲存了ROWID的值,通過訪問索引,得到ROWID,再定位到記錄。

ROWID採用Base64編碼,共18位代表80位二進位制數,佔用10個位元組。
每組字元代表不同的含義,18位最大定址空間“32G”。。
對一條行ID的解析:OOOOOO.FFF.BBBBBB.RRR   --其中.是為了方便觀看手動增加
OOOOOO: 1-6位:物件id
FFF:    7-9位:檔案id
BBBBBB: 10-15位:塊id
RRR:    16-18位:行id
對於Base64編碼,共18位代表80位二進位制數,計算方法是:
32bit obj# + 10bit file#  + 22bit block#  +  16bit row#
通過ROWID計算資料塊的相關資訊,詳見:http://blog.csdn.net/q947817003/article/details/11490051
根據small file tablespace的ROWID,計算出表空間、資料檔案、BOOCK中行最大數如下:
根據ROWID的構成:          ---注:2^10這種寫法代表2的10次方,等於1024.
每個表空間最大檔案數:      2^10 1024 ,去掉全0和全1 通常1022個  ---實驗測試出是1023個,見:資料檔案個數大於1024時ORACLE資料檔案FILE_ID及RELATIVE_FNO的變化示例
每資料檔案最大資料塊數量:filesize=block_size*2^22   ,也就是4M個ORACLE BLOCK

每個BLOKC中行數是:       2^16   65536,也就是每個BLOCK最多65536條記錄

每個資料庫最多65536個-64K個資料檔案(實驗測試出是65534----官方文件上是65533-http://docs.oracle.com/cd/B19306_01/server.102/b14237/limits002.htm#i287915,最多支援64K個表空間,因為每個表空間最少需要包含一個資料檔案。引出新問題:如果資料庫有大於1024個資料檔案,ORACLE如何通過ROWID定位資料檔案呢? --詳見:資料檔案個數大於1024時ORACLE資料檔案FILE_ID及RELATIVE_FNO的變化示例

更詳細的資料庫限制見官方文件:http://docs.oracle.com/cd/B19306_01/server.102/b14237/limits.htm#REFRN004

smallfile tablespace設定不同大小的db_block_size時資料檔案允許的最大大小

db_block_size=2KB,2KB*4M=8192M      8G
db_block_size=4KB,4KB*4M=16384M     16G
db_block_size=8KB,8KB*4M=32768M     32G     8*1024*4M=8*4G=32G
db_block_size=16KB,16KB*4M=65536M   64G
db_block_size=32KB,32KB*4M=131072M   128G
#########################################################

BIGFILE表空間的ROWID

因為大檔案表空間只能包含一個檔案,所以ROWID中不需要file#-檔案ID。
大檔案表空間的ROWID格式為:
OOOOOO.LLLLLLLLL.RRR
OOOOOO: 1-6位:物件id
LLLLLLLLL: 7-15位:塊id
RRR:    16-18位:行id
L代表BLOCK號,代替了小檔案表空間中ROWID中的file#  +  block#的位置.
這樣大檔案表空間的資料檔案支援的BLOCK數量最多是:2bit. 2^32=4G.

bigfile tablespace設定不同大小的db_block_size時資料檔案允許的最大大小

db_block_size=2KB,2KB*4G= 8T
db_block_size=4KB,4KB*4G= 16T
db_block_size=8KB,8KB*4G= 32T        8*1024*4G=8*4TB=32TB
db_block_size=16KB,16KB*4G= 64T
db_block_size=32KB,32KB*4G=128TB

相關文章