普通表空间和大文件表空间的数据文件个数及数据文件大小限制
今天测试下普通表空间和大文件表空间的数据文件大小限制,可能大家在面试的时候被问过这样的问题,也都知道这是受ROWID限制的,但具体怎么限制的有些人就说不清楚了。
大家都知道,BLOCK_SIZE=8K的普通表空间,单个数据文件大小最大32G,大文件表空间数据文件大小可以达到32T,BLOCK_SIZE=16K的普通表空间,单个数据文件大小最大64G,大文件表空间数据文件大小可以达到364T,ROWID是怎么限制数据文件大小的呢?下面来看下测试。
先创建一个普通表空间和一个大文件表空间。
SQL> create tablespace x_test datafile 'D:APPSTREAMORADATADBDREAMx_test.dbf' size 5m autoextend on; 表空间已创建。 SQL> create bigfile tablespace d_test datafile 'D:APPSTREAMORADATADBDREAMd_test.dbf' size 5m autoextend on; 表空间已创建。
查询下这两个表空间的数据文件最大大小能到多大。
SQL> select FILE_ID,FILE_NAME,BYTES,BLOCKS,MAXBYTES/1024/1024/1024,MAXBLOCKS from dba_data_files where FILE_ID in(6,7); FILE_ID FILE_NAME BYTES BLOCKS MAXBYTES/1024/1024/1024 MAXBLOCKS ---------- ---------------------------------------- ---------- ---------- ----------------------- ---------- 6 D:APPSTREAMORADATADBDREAMX_TEST.DBF 5242880 640 31.9999847 4194302 7 D:APPSTREAMORADATADBDREAMD_TEST.DBF 5242880 640 32768 4294967293
可见,对于8K大小的BLOCK SIZE,普通表空间的一个数据文件最大32G,大文件表空间的一个数据文件最大可达32T,ROWID是怎么限制数据文件大小的呢?看看下面ROWID的介绍就清楚了(现在我们看到的ROWID基本都是扩展ROWID,由18个字符表示)。
扩展的ROWID 在磁盘上需要10 个字节的存储空间,并使用18 个字符来显示。它包含下列组成元素:
1. 数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的
2. 相关文件编号:此编号对于表空间中的每个数据文件是唯一的
3. 块编号:表示包含此行的块在数据文件中的位置
4. 行编号:标识块头中行目录位置的位置
在内部,存储的10个字节(bytes),即80位(bit)又按如下规则进行划分:
(1)数据对象编号需要32 bit
(2)相关文件编号需要10 bit
(3)块编号需要22 bit
(4)行编号需要16 bit
相对文件号需要10个bit来表示,这就决定了普通表空间最多可以存在2的10次方个数据文件也就是1024个数据文件(实际上一个普通表空间最多可有1022个数据文件,有的资料说要去掉全0和全1的ROWID,也有资料说有两个预留为需要去掉,就是1022个数据文件了)。
数据块决定数据文件的大小,块编号需要22bit,那么也就是一个数据文件最大能有2的22次方减去2个数据块,数据块的个数乘以块大小就是数据文件的大小,可以通过下面的SQL算出(以下针对小文件表空间)。
SQL> select (power(2,22)-2)*8/1024/1024 GB,power(2,22)-2 BLOCK from dual; GB BLOCK ---------- ---------- 31.9999847 4194302
可见这个值和上文查到的普通表空间的数据文件大小一模一样,那么大文件表空间ROWID是怎么限制的呢?这是因为大文件表空间只能有一个数据文件,这就省了相关文件编号需要的10 bit,因为有且只有一个数据文件,就没必要去标识它了,这样这10bit就给了块编号,这样大文件表空间的块编号由之前的22bit扩大到32bit,也就是大文件表空间的数据文件最大可以达到2的32次方减2个数据块,乘以数据块大小就是数据文件的大小。
SQL> select (power(2,32)-2)*8/1024/1024 GB,power(2,32)-2 BLOCK from dual; GB BLOCK ---------- ---------- 32768 4294967294
但是,一般大文件表空间都很难达到预期的值,因为要考虑到不同文件系统上最大文件大小的上限,比如linux的ext3文件系统最大文件只支持到2T,如果在linux的ext3文件系统上使用大文件表空间,那么数据文件最大就只能到2T。
——————————————————-end—————————————————-
果断拿走,侵权勿怪
2014-11-05 17:43