一. 段类型
Oracle中的段(segment)是占用磁盘上存储空间的一个对象,不同类型的段存储了不同的数据,管理存储空间的方式也不相同。
主要几种段类型:
1. 聚簇:用于存储多个表上的相关数据,将多个表相关联的部分存储到一个数据块上,方便查找与访问。
2. 表:用于保存一个表的数据,通常与索引段联合使用。最常见的段,用于存储表数据的。
3. 表分区:用于分区。
4. 索引:这种段类型可以保存索引结构。
5. 索引分区:与表分区类似,主要是管理分区表的。
6. 嵌套表:为嵌套表指定的段类型。
7. 回滚段:undo数据存储所在地。
比如:这条sql语句 Create table t ( x int primary key, y clob, z blob ); 会创建6个段。
1. 表本身是一个段
2. 主键约束创建了一个索引段
3. 每一个LOB列分别创建了2个段,一个段用于存储字符大对象(CLOB)或二进制大对象(BLOB)所指的实际数据块,另一个段用于组织这些数据块。
二. 段空间管理
管理方式有2种:手动与自动
三. 高水位线
高水位线是针对表段而言,表段存储了很多用户数据。把表段想象成从左到右依次排开的一系列块,高水平线(high-water mark,HWM)就是包含了数据的最右边的块,如下图所示:
上图显示了HWM首先位于新创建表的第一个块中。过一段时间后,随着在这个表中放入数据,而且使用了越来越多的块,HWM会升高。如果我们删除了表中的一 些(甚至全部)行,可能就会有许多块不再包含数据,但是它们仍在HWM之下,而且这些块会一直保持在HWM之下,直到重建、截除或收缩这个对象。
HWM很重要,因为Oracle在全面扫描段时会扫描HWM之下的所有块,即使其中不包含任何数据。这会影响全面扫描的性能,特别是当HWM之下的大多数块都为空时。
四. freelists
freelists 为手动段空间管理时候的一个参数,手动段空间管理也就是手动表空间管理,只有段所在的表空间为手段管理,段空间才为手动管理。在往表段插入数据的时候,会先找freelist,freelist上挂的都是空闲的块,可以被使用。如果只有一个freelist,那么并发的插入,就会性能很差。所以freelist的数量要配置得合适才行。但是,太大了也不行。假如配置了100个freelist,但是最多只可能用到10个。就会浪费许多空间。
如果采用自动段空间管理,就没有这个问题了,数据库会自动进行设置。