从Oracle8i开始,Oracle支持两种类型的表空间:数据字典管理表空间和本地化管理的表空间。并且Oracle公司一直推荐用户使用本地化管理的表空间。我们知道,本地化管理的表空间中,数据文件空间是通过文件自身的文件头中的位图进行管理的。数据文件头用0和1表示文件中没有使用和已经使用的区,而不用再维护系统表。这样做的好处是显然的,Oracle在分配新区时,只需要扫描文件头,查找可用空间;对于相邻空间的合并,更是容易,只要判断相邻的区位图代码是否为0即可。
那么在本地化管理的表空间中,数据文件文件头中的位图管理区到底占用多大的空间呢?我们分别来看看下面的例子。
一 非统一尺寸的本地化管理表空间
创建一个非统一尺寸的本地化管理表空间。
SQL> create tablespace ts_test_2
2 datafile 'D:\ORACLE\ORADATA\LEGEND\ts_test_2_01.ORA' size 100M
3 extent management local;
表空间已创建。
SQL> select sum(bytes/1024/1024) free_space
2 from dba_free_space
3 where tablespace_name = 'TS_TEST_2';
FREE_SPACE
----------
99.9375
从上我们可以看到,表空间被使用了(100-99.9375)×1024 = 64K。
二 统一尺寸的本地化管理表空间
创建一个统一尺寸的本地化管理表空间。
SQL> create tablespace ts_test
2 datafile 'D:\ORACLE\ORADATA\LEGEND\ts_test01.ORA' size 100M
3 extent management local
4 uniform size 5M;
表空间已创建。
SQL> select sum(bytes/1024/1024) free_space
2 from dba_free_space
3 where tablespace_name = 'TS_TEST';
FREE_SPACE
----------
95
难道表文件被使用了5M?
再创建一个区大小为10M的看看。
SQL> create tablespace ts_test_3
2 datafile 'D:\ORACLE\ORADATA\LEGEND\ts_test_3_01.ORA' size 100M
3 extent management local
4 uniform size 10M;
表空间已创建。
SQL> select sum(bytes/1024/1024) free_space
2 from dba_free_space
3 where tablespace_name = 'TS_TEST_3';
FREE_SPACE
----------
90
被使用了10M。就是说文件分配的第一个区被管理文件给占用了。果真如此吗?
为什么非统一尺寸的本地化管理表空间占用的是64K,而统一尺寸的本地化管理表空间占用了第一个区呢?我尝试修改数据文件的大小,意外的事情发生了。
SQL> alter database
2 datafile 'D:\ORACLE\ORADATA\LEGEND\ts_test01.ORA' resize 102464k;
数据库已更改。
给统一尺寸的本地化管理表空间的数据文件增加64K大小。再查询。
SQL> select sum(bytes/1024/1024) free_space
2 from dba_free_space
3 where tablespace_name = 'TS_TEST';
FREE_SPACE
----------
100
未使用的空间就是100M了。
可见,在统一尺寸的本地化管理表空间的数据文件中,位图管理占用的空间和非统一尺寸的本地化管理表空间的数据文件一样,都是64K。
转贴: http://blog.sina.com.cn/s/blog_55844be4010002ki.html