表空间与碎片

在本地管理的表空间中,怎么预防空间碎片问题呢?要想防止,就得很好的理解碎片如何产生。
在本地管理的表空间,可以继续选择更细的管理方式:统一尺寸(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
    评论
PL/SQL Developer是Oracle数据库当前最流行的开发工具之一,它在ORACLE数据库开发设计方面功能强大,使用方便,但是数据库管理方面一直比较欠缺。 DBATools For PL/SQL Developer 是一款PL/SQL Developer的辅助插件,主要功能是提供许多DBA数据库管理的功能,使ORACLE工程师不仅可以使用PL/SQL Developer进行开发设计,同时也可以进行数据库管理及监控,大大提高工作效率。 功能列表: 1.表空间管理 2.初始化参数管理 3.重做日志管理 4.数据库监视 4.1.查看SGA统计信息 4.2.查看排序情况 4.3.查看日志切换情况 4.4.查看锁资源 4.11.查看库缓存命中率 4.6.查看数据缓存命中率 4.7.查看WorkArea情况 4.8.查看当前会话等待事件 4.9.查看数据库大小 4.10.查看等待事件统计信息 5.清空缓冲区 6.导出数据库表结构文档 7.快速打开TNSNAME.ORA文件 8.快速打开listener.ORA文件 9.快速打开Oracle Net Manager 10.自定义配置 10.1.语言配置,支持中英两种语言 10.2.菜单自定义配置 10.3.数据库监视SQL自定义配置 11.快捷菜单 11.1.表 11.1.1.分析表 11.1.2.取表记录数 11.1.3.创建物化视图日志 11.1.4.设置并行度 11.2.视图 11.2.1.取表记录数 11.3.物化视图 11.3.1.分析 11.3.2.取表记录数 11.3.3.刷新 11.3.4.设置并行度 11.4.数据库链接 11.4.1.测试 11.11.列 11.11.1.分析 11.6.索引 11.6.1.分析 11.6.2.重建 11.7.表空间 11.7.1.管理 11.7.2.新增 11.7.3.编辑 12.导出菜单 12.1.导出属性方式的XML文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值