Home >Database >Mysql Tutorial >数据文件头块保留大小、ROWID、数据文件最大大小等数据库限制的

数据文件头块保留大小、ROWID、数据文件最大大小等数据库限制的

WBOY
WBOYOriginal
2016-06-07 15:47:541132browse

学习自EYGLE循序渐进ORACLE及官方文档。 本地管理表空间中设置不同大小的db_block_size时数据文件头保留空间对应如下: db_block_size=2KB,文件头保留32个数据块,即64KB。 db_block_size=4KB,文件头保留16个数据块,即64KB。 db_block_size=8KB,文件头保

学习自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
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn