本地管理表空間中設置不同大小的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 tablespacesmallfile 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 8Gdb_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= 8Tdb_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