extent是一个逻辑上的空间单位,有多块连续的oracle block组成,多块的extent会组成一个segment,但segment中现有的extent都满了后,就会分配一些新的extent给这个segment
Extent的分配时间
当table新创建的时候,数据库会分配一个initial的extent给当前segment,当这个segment满了之后,就会分配incremental extent给该段。为维护的需要,segment中最前面的一个block会记录该segment所有extent的信息(地址)
Extent的数目和大小
在创建表的时候,可以使用storage 语句来指定initial 和incremental的extent的数目,如果没有指定的话,则使用表空间的默认值。
表空间可以指定使用uniform或者variable的extent,如果是variable 大小的extent话,则是有系统自动管理。 当创建表空间时,语句uniform 和autoallocate就是用来指定extent大小的。
Dictionaly mangement的表空间使用数据词典来追踪extent的使用情况,而local management的表空间,则使用文件的bitmap来追踪。
uniform的话,大小可以由用户指定或者使用默认值1M,需要保证每个extent都至少有5个以上的oracle block.对于local 管理的临时表空间,只可以使用uniform 大小的extent
system-management的extent,则是由数据库根据优化自动指定,最小超过64k,但如果每一个oracle block大于16k,并且segement自动管理,则最小超过1M
Extent如何分配
Oracle提供了一个segment advisor的工作来帮助决定对象是否有空闲内存可以回收
一般情况下,segment中extent不会被回收到表空间,除非触发了drop语句,如drop table,drop cluster.但是下面两种情况例外
如果表或者集群哦owner或有delete any 权限的用户执行了truncate..storage这样的语句
DBA主动释放,语句:alter table table_name deallocate unused.
Oracle会不间断的将会滚段的空闲extent释放到表空间,如果optimal size被指定的话。
在extent被释放后,oracle修改bitmap或者数据词典。所有这些extent中block的数据将不可访问
非集群表
词典管理表空间,需要聚合分散的extent来容纳大的数据(查找/组合),而Local管理的表空间则不需要(本身就在文件中)
集群表
集群表的空间是属于集群的,所以extent被释放后,空间先回归集群,则该集群的其他表可以访问,集群外则不可以。集群被drop后,才回归到表空间。
物化视图和它的log
处理方式同表
索引
只有在索引被drop,或者索引寄生的表/集群被drop,extent回收
临时段(temporary segment)
Oracle执行完成需要临时段的语句,Oracle自动drop这个segment,然后空间回滚到表空间,如single sort
但是对于multiple sort,oracle会在临时表空间中分配一个特殊的段,该段每一个进程只分配一次,将不会不回收当multiple sort结束后
临时表空间的临时表在drop之后空间回归到临时表空间
会滚段
Oracle定时检查是否optimal size