【表空間支持的最大數據文件大小的算法】【數據庫限制】【數據文件文件頭保留數據塊數】


本地管理表空間中設置不同大小的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。--爲什麼不是64kb?
默認是db_block_size=8KB,此時 ORACLE數據文件頭的8個數據塊作用是:

數據塊1和2記錄數據文件頭信息。3-8用於記錄extent-區間的位圖信息 

extent management local uniform size 256K--分配每個extent最小包含256k個block,size最小爲8.

分配每個extent最小包含X個block? 假設db_block_size=16KB,文件頭保留4個數據塊,即64KB。

4M<=X*64k*8

X>=8

--每個數據文件最大有4M個塊,保留數據塊中每個bit表示X個block的使用狀態,保留數據塊需要存儲4M個塊的狀態。



表空間支持的最大數據文件大小的算法:

分兩種情況: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個字節。--1Byte=8bit
每組字符代表不同的含義,18位最大尋址空間“32G”。。--??
對一條行ID的解析:OOOOOO.FFF.BBBBBB.RRR   --rowid結構6-3-6-3
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/hughwang1216/article/details/12927701

http://blog.csdn.net/hughwang1216/article/details/11871305


最大數 算法 備註 實驗測試
每個表空間最大文件數  2^10[1K] 去掉全0 1023
每數據文件最大數據塊數量 2^22-1[4M] 去掉全0 4194304
每個BLOKC中行數 2^16[64k] 去掉全0  
數據庫對象最大數 2^32[4G] 去掉全0  



錯誤:每個數據庫最多64K個數據文件,最多支持64K個表空間,因爲每個表空間最少需要包含一個數據文件。

更正:每個數據庫最多64K個數據文件,小表空間最多支持64個表空間,大表空間最多支持65k個表空間。因爲大表空間的每個表空間只有一個數據文件。Oracle爲了保證小表空間的每個空間可以容納1023個數據文件,所以在表空間個數上做了限制也就是64k/1023約等於64個表空間。

--官方文檔上是65533--怎麼算出來的??


引出新問題:如果數據庫有大於1024個數據文件,ORACLE如何通過ROWID定位數據文件呢? 

在超過1023個數據文件後,oracle就會保證在整個數據庫內file_id是唯一的,在單個表空間中relative_fno是唯一的。

那麼這時就會存在一個問題,不同表空間中的具有相同相對文件號數據文件oracle是怎樣區分開來的那?

32bit obj# + 10bit file#  + 22bit block#  +  16bit row#按照下面理解

data_object_id,rfn,block#,row#。

一個數據文件只能屬於一個表空間,通過data_object_id 和數據字典視圖的結合,oracle可以知道指向的是那一個表空間,從而將rfn轉換爲file_id,從而也就可以準確的進行行定位。

data_object_id(一般是段編號) ->屬於哪個表空間->relative_fno->file_id



更詳細的數據庫限制見官方文檔:http://docs.oracle.com/cd/B19306_01/server.102/b14237/limits.htm#REFRN004--??


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#的位置.

對於Base64編碼,共18位代表80位二進制數,計算方法是:

32bit obj# + 32bitfile&block#   +  16bit row#

這樣大文件表空間的數據文件支持的BLOCK數量最多是:2^32=4G. 



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 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章