Oracle表空间Tablespace是逻辑结构的最高层次,其他分别对应段对象segment、区extent和块block。而物理层面的Oracle数据库是通过一系列的文件构成,其中数据文件datafile是与Tablespace进行对应的对象。
Tablespace与Datafile的关系是一对多的关系。一个表空间Tablespace可以对应多个Datafile,Datafile则是只能归属在一个Tablespace里。传统的Oracle管理概念中,倡导一个表空间中创建多个数据文件,特别是创建分布在多个存储磁盘上,以期分散I/O。但是,Oracle10g推出的BigFile Tablespace大文件表空间,将这个概念有所变化。
Bigfile tablespace
在Oracle 10g中,推出了Bigfile tablespace的概念。表空间Tablespace从Oracle 10g以后就分为两个类型,smallfile tablespace和bigfile tablespace。过去一个表空间对应多个数据文件我们成为Smallfile Tablespace。所谓Bigfile Tablespace最显著的差别就是一个表空间只能对应一个数据文件。Bigfile Tablespace虽只对应一个数据文件,但数据文件对应的最大体积大大增加。传统的small datafile每个文件中最多包括4M个数据块,按照一个数据块8K的大小核算,最大文件大小为32G。每个Small Tablespace理论上能够包括1024个数据文件,这样计算理论的最大值为32TB大小。而Bigfile Datafile具有更强大的数据块block容纳能力,最多能够包括4G个数据块。同样按照数据块8K计算,Bigfile Datafile大小为32KG=32TB。理论上small tablespace和big tablespace总容量相同。
创建语句:
SQL> create bigfile tablespace bttest datafile 'F\ORCL\BTTEST.dbf' size 10m autoextend off extent management local uniform size 100m segment space management auto;
通过create bigfile tablespace语句建立Bigfile Tablespace。注意两方面的问题,其一是Bigfile Tablespace必须使用local本地extent管理方式,不允许使用DMT(Dictionary Managed Tablespace)。另一方面是段segment空间使用auto自动方式,不要使用manual。
这两个条件在Undo或者临时Bigfile表空间的时候,是允许例外的。
Small Tablespace和Bigfile Tablespace是可以并存的。
在创建bigfile tablespace的时候,就已经指定了数据文件,是不允许添加第二个数据文件的。
Bigfile Datafile大小有多大
一个数据文件最大能有多大,在Oracle中有两个因素控制,一个是Oracle内部寻址能够寻找到的最大范围多少个块,另一个是数据库每个块大小是多大。
Small Datafile的情况:
Rowid是一个用16进制表示的18位长度类字符串。其中,前6位表示object_id,之后3位表示文件编号,之后6位表示块号,最后3位表示row的slot编号。
在small datafile中,对数据块有6×4=24位二进制表示。Oracle利用中间的22位进行块地址存储。这样,22位二进制可以表示的数据块编号范围为(2^22-1)=4M个数据块。如果按照每个数据块8K的普遍大小计算,这样每个small datafile大小上限就是32G。如果按照每个数据块上限32K计算,这样每个small datafile大小上限就是128G。
bigfile datafile的情况:
在bigfile datafile中,事情有所不同。由于没有relative_fno的问题,这样rowid中就不需要保存relative_fno的最多1024的数值。这样就节省出10位二进制位给数据块定位,相同长度的rowid就可以进行32位二进制长度的数据块寻址。每个bigfile datafile中,最多可以包括到(2^32-1)=4G个数据块。在数据块大小8K的环境下,最大为32TB数据。如果是数据块大小为32K环境下,文件最大可以到128TB大小。




