1、如何决定数据扩展分配的数量与容量:
每个段的定义中包含了数据扩展的存储参数,这个参数可以表征数据创建表或者索引的时候为数据扩展分配多少数据块,或者限定 一个表(一个数据段)最多可以有多少 数据扩展。我们可以在 CREATE TABLE 语句中用STORAGE子句设定这个参数,如果没有设定,那就用这个段所在表空间的默认参数。
在本地管理表空间中,一个数据扩展的容量可以使手工设定的固定值,也可以是系统自动设定的可变值,注意:这是在创建表空间时就设定好的跟上面的在段内的存储参数是不一样的。在创建表空间的时候,可以用UNIFORM 这个设定固定值,也可以用AUTOALLOCATE设定为可变值。
- 对于固定容量(UNIFORM)的数据扩展,用户可以为数据扩展设定容量或使用默认大小(1 MB)。用户须确保每个数据扩展的容量至少能包含5个数据块(database block)。本地管理(locally managed)的临时表空间(temporary tablespace)在分配数据扩展时只能使用此种方式。
- 对于由系统管理(AUTOALLOCATE)的数据扩展,由Oracle决定新增数据扩展的最佳容量,其最小容量为 64 KB。如果创建表空间时使用了“segment space management auto”子句,且数据块容量大于等于 16 KB,Oracle扩展一个段时(segment)所创建的数据扩展的最小容量为 1 MB。对于永久表空间(permanent tablespace)上述参数均为默认值
2、数据扩展如何被分配:
oracle根据表空间的管理方式不同,分为本地管理或者数据字典管理,现在除了system表空间意外,基本上都是本地管理。
所以我们只说本地管理表空间数据扩展的分配方式:对于本地管理的表空间,当需呀新的数据块来存储数据的时候,首先选择一个数据此表空间的物理的数据文件,然后搜索此数据文件的位图,查找连续的数据块。如果此数据文件中没有足够的空间用来存储数据,那oracle会继续查找下一个数据此表空间的数据文件。
3、数据扩展的回收:
oracle提供了一个叫segment advisor的工具,他能依据方案对象内存储空间的碎片程度判定是否需要回收数据扩展。
一般情况下,在oracle移除一个方案对象之前,这个方案对象里的数据扩展是不会被回收的,也就是说,你只要分配给人家了,人家还没死,你就不能要会来。但是,有几个很不地道的情况还是可以要会来的。来咱看看:
1) 表、簇表的所有者,或者拥有delete any权限的用户,可以使用一个DDL语句 叫 TRUNCATE ....DORP STORAGE 语句将表或者簇表的语句清除。这时,里面的段就可以回收了。。人家还没死呢。。哎。。
2)一个段中如果有没有使用的数据扩展,dba可以用一个语句来收集回来:
ALTER TABLE table_name DEALLOCATE UNUSED.
3)如果用户为回滚段(rollback segment)设定了 OPTIMAL 参数,Oracle将周期性地从其中回收数据扩展。
数据扩展被释放后,oracle会修改数据文件中的位图,将新释放的数据扩展视为可用空间,其内的数据无法被访问。
4、看几个特殊情况:
1、簇表中的数据扩展:因为整个簇才是一个段,所以当oracle移除(drop)一个簇表中的表时,其中的数据扩展不会被回收,如果想回收,那只能通过移除(truncate)整个簇表来实现。(哈希簇表除外,这个以后研究他)
2、物化视图及其日志的数据扩展回收与表是一样的,不再做重复介绍。
3、索引的数据扩展,只要索引存在,那就不会被回收,但是删除了索引,或者将索引对应的表删除之后,索引就会被自动回收了。
4、临时表中临时段的数据扩展管理:当Oracle执行完一个 SQL 语句,且在执行过程中使用的临时段(temporary segment)时,Oracle自动地移除(drop)临时段,并将属于此临时段的数据扩展(extent)空间还给临时段所在的表空间(tablespace)。当用户执行单一排序(single sort)语句时,Oracle将在此用户的临时表空间(temporary tablespace)中创建为这个排序服务的临时段(temporary segment),并在执行后将此临时段使用的数据扩展回收。但是对于多重排序(multiple sort),可能会使用临时表空间(temporary tablespace)中专为排序而创建的排序段(sort segment)。在每个实例中只会分配一个排序段,在排序操作使用后也不会被回收,而是继续供以后的多重排序使用。同一会话或同一事务的多个 SQL 语句,有可能共同使用一个临时表(temporary table)的临时段(temporary segment)存储临时数据。在这种情况下,Oracle在会话或事务结束后 才移除(drop)临时段,并为临时段所在表空间回收使用的数据扩展(extent)。
5、回滚段的数据扩展管理:Oracle周期性地检查数据库回滚段(rollback segment)的容量是否超过了最优值(optimal size)。如果回滚段超过了这个最优值(即回滚段中的数据扩展(extent)过多),Oracle将自动地从回滚段回收一些数据扩展。