当前位置: 首页 > Oracle, oracle 10g, oracle 11g > 正文

普通表空间和大文件表空间的数据文件个数及数据文件大小限制

今天测试下普通表空间和大文件表空间的数据文件大小限制,可能大家在面试的时候被问过这样的问题,也都知道这是受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—————————————————-

 

本文固定链接: http://www.dbdream.com.cn/2014/03/%e6%99%ae%e9%80%9a%e8%a1%a8%e7%a9%ba%e9%97%b4%e5%92%8c%e5%a4%a7%e6%96%87%e4%bb%b6%e8%a1%a8%e7%a9%ba%e9%97%b4%e7%9a%84%e6%95%b0%e6%8d%ae%e6%96%87%e4%bb%b6%e4%b8%aa%e6%95%b0%e5%8f%8a%e6%95%b0%e6%8d%ae/ | 信春哥,系统稳,闭眼上线不回滚!

该日志由 dbdream 于2014年03月10日发表在 Oracle, oracle 10g, oracle 11g 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 普通表空间和大文件表空间的数据文件个数及数据文件大小限制 | 信春哥,系统稳,闭眼上线不回滚!
关键字: , , ,

普通表空间和大文件表空间的数据文件个数及数据文件大小限制:目前有1 条留言

  1. 沙发
    _唯美__:

    果断拿走,侵权勿怪

    2014-11-05 17:43 [回复]

发表评论

快捷键:Ctrl+Enter