表空间与碎片

在本地管理的表空间中,怎么预防空间碎片问题呢?要想防止,就得很好的理解碎片如何产生。
在本地管理的表空间,可以继续选择更细的管理方式:统一尺寸(uniform)还是自动分配(autoallocate)。若选择了统一尺寸,则可以详细指定每个区间(extent)的大小,若不加指定,则默认每个extent使用1MB的大小,这个时候,每个bit位图表示一个extent;若选择自动分配,则表明让oracle来决定extent的使用办法,这个时候,每个bit位图表示64KB的固定大小,每个extent则是64KB的整数倍。

一、本地统一尺寸的extent管理方式:
这种管理方式下,在表空间头部的位图中,用0与1来表示未用的或者已经使用过的空间。1表示已使用,0表示未使用。
下面这个例子,先创建一个本地管理的表空间,extent大小为1MB
SQL> create tablespace test_uniform
  2  datafile '/tmp/test_uniform.dbf' size 10M
  3  extent management local uniform size 1M;

表空间已创建。

然后创建一个表,指定初始大小与NEXT大小都是8MB

SQL> create table test(x number) tablespace demo_lmt
  2  storage (initial 8M next 8M);

表已创建。

虽然取消了NEXT参数,但是,如果指定了NEXT参数,也不会出现任何错误,只是oracle在这里忽略了这个参数。
表创建完成之后,查看他的实际大小与NEXT大小:

SQL> select table_name,initial_extent,next_extent from user_tables
  2  where table_name='TEST';

TABLE_NAME                     INITIAL_EXTENT NEXT_EXTENT
------------------------------ -------------- -----------
TEST                                  8388608     1048576

可以看到,初始区间的确是8MB,但是,NEXT大小是1MB,并不是我们指定的8MB,那么,初始区间的8MB,到底是几个Extent呢?

SQL> select count(*) from user_extents where segment_name='TEST';

  COUNT(*)
----------
         8
         
可以发现,实际上有8个extent,既然是8个不同的extent,那么,他们就可以是不连续的物理空间,且只需要有8个标准尺寸的1MB空间就可以了。
根据以上的原理,每个段的extent大小都等于表空间的统一尺寸大小,所以,根本不可能产生空间碎片。

不过,在统一尺寸的分配方式中,也还要注意如下两个问题:
1,不同大小的表最好设置不同大小的extent的表空间。对于几个GB的表,采用1MB的extent大小是比较合理的;如果表非常大,如 几十GB或几百GB,则可以考虑8MB、16MB、32MB甚至更大的extent尺寸。这种情况下,创建不同extent大小的表空间即可。
2,如果采用了比较大的extent大小,注意每个数据文件后面的空间浪费。如一个数据文件大小是2000MB,每个extent大小为64MB,但是,因为位图与数据文件头占了64KB,所以(2000M-64K)/64M是除不尽的,必将造成每个数据文件后面浪费差不多64MB的空间。这样的情况下,可以考虑把数据文件大小设置为2001Mb,就可以避免空间浪费了。

二、本地自动extent管理方式
前面讲述了表空间的统一分配,那么,再看看表空间在自动分配情况下是否有碎片。在自动分配的本地管理的表空间中,区间尺寸可能由64KB、1MB、8MB、64MB甚至是256MB等尺寸组成。但是不管尺寸有多大,都有一个通用尺寸64KB,所以64KB就是该表空间的位图(bit)大小。      
在这种方式下,每个位图(1或0)只代表64Kb的基本空间,而不代表统一管理方式中的一个extent大小(uniform size)。
一定程度上存在跟字典管理中同样的问题。如一个extent大小可以等于多个位图,如果表空间中存在很多比较小的连续空间,如64Kb、128kb,那么申请比较大的extent的时候,一样也是申请不了的。
所以,在用户的表空间中,不建议使用自动分配,还是采用统一尺寸分配。
比如,有一个表空间,上面有十个数据文件,每个数据文件还剩500MB的空间,但是,现在有一个段突然需要分配512MB的空间,一样会导致空间分配失败。
不过,自动分配也不是一无是处。应当看到,系统表空间就是自动分配,而且还非常适合,因为:
1,每个对象都不大,但是对象非常多,这样的情况下,如果统一分配,可能造成空间的浪费。而自动分配的基数是64KB,比较节省空间。
2,这些对象基本都不被删除与添加,也就是结构比较稳定。
3,新创建的对象,不指定初始大小,方便使用空间空间。
如果你的业务也满足如上的条件,其实,也完全可以使用自动分配,因为这样可以节省很多空闲空间,也不会有空间碎片产生。
  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值