()段区段块
Oracle中的段segment是占用磁盘存储空间的一个对象从逻辑上讲一个数据库由若干表空间(TABLESAPCE)组成每个表空间有若干个表(TABLE)每个表又可以分为若干数据段(DATA SEGMENT)索引段等每个段又可分为若干数据库区间(EXTENT)每个区间由若干数据块(BLOCK)组成区段(EXTENT)是最小的分配单块(BLOCK) 是最小的存储单位
()常见的段类型
聚簇cluster分为散列聚簇和B*树聚簇通常用于存储多个表上的相关数据
可以在聚簇段中建表此时这个表可能与其它表同在一个聚簇段中
表table表段用于保存一个数据库表的数据是最常用的段类型通常与索引段结合使用
表分区partition或子分区subpartition主要用于分区与表段类型
索引index这种段类型用于保存索引结构
Lob分区子分区索引Lob段用于保存大对象的结构每个LOB列需要分别创建两个段一个用于存储CLOB或BLOB的
实际数据块logsegment另一个是用于跟蹤这些LOB块在哪里的lobindex
嵌套表nested table这是为嵌套表指定的段类型
回滚段用于存放undo的数据
()段的管理
手动段空间管理Manual Segment Space Management
手动设置FreeListsFreeList GroupsPctUsed其它参数来控制如何分配使用重用段空间MSSM是oracle的遗留实现许多版本都支持MSSM
自动段空间管理Automatic Segmnet Space Management
只需要控制与空间使用相关的PctFree其它参数被忽略ASSM只有在i版本后才被引入用于减少MSSM中的太多参数的管理
应用于ASSM段的存储设置只有Buffer_PoolPctFreeIniTransMaxTrans(g后的版本都会忽略这个参数)其它存储和物理属性参数都不适用于ASSM段
段空间管理是从段的表空间继承来的一个属性而且段都没有跨表空间段要使用ASSM就必须位于支持ASSM空间管理的表空间中
HWM高水平线
HWM是随着表数据的增长而增长的只有重建截除收缩对象时HWM才会降低HWM很重要因为在oracle进行全表扫描时会扫描HWM下的所有块即使这张数据库表不包含任何数据
TrunCate会把表的HWM重新置为还会截除表上的相关索引而DELETE整张表时并没有修改HWM所以如果打算删除表的所有行应尽量使用TrunCate
在MSSM表空间中段只有一个HWM但在ASSM表空间中除了HWM外还有一个低HWM这是因为在ASSM中HWM推进时ORACLE并没有立即格式化所有的物理块而是只在第一次使用时才会完成格式化以便安全读取
freelists
freelists是使用MSSM表空间时oracle使用块时需要把块放在freelist或从freelist中删除freelists可能对性能有很大的提升或有很大的影响
而在ASSM中没有也不用去设置freelist参数
create tablespace assm datafile size m autoextend on next m segment space management auto;
create table xxx() tablespace assm;
()pctfree与pctused
PctFree告诉oracle应该在块上保留多少空间来完成将来的更新默认值是%如果自由空间的百分比高于PctFree指定值这个块就称为自由的PctUsed告诉oracle应在当前不自由的块上自由空间的百分比需要达到多大时才能使它再次变为自由的默认值为%
使用MSSM 时这两个参数设置控制着块何时放入freelist 中以及何时从freelist 中取出如果使用默认值PCTFREE为PCTUSED为那么在块到达%满之前(有%以上的自由空间)这个块会一直在freelist 上一旦到底%就会从freelist 中取出而且直到块上的自由空间超过了块的%时才会重新回到freelist上在此之前这个块一直不在freelist上
使用ASSM 时PCTFREE 仍然会限制能否将一个新行插入到一个块中但是它不会控制一个块是否在freelist上因为ASSM根本不使用freelist在ASSM 中PCTUSED参数将被忽略
如果把块的PCTFREE 设置得过高就会浪费空间如果把PCTFREE 设置为%而你从未更新数据那么每个块都会浪费%的空间不过对行初始很小现在想将行的大小加倍这种情况下%的设置就非常合理但是倘若PCTFREE 设置得太小更新行时就会导致行迁移
高PCTFREE低PCTUSED
如果你插入了将要更新的大量数据而且这些更新会频繁地增加行的大小此时就适合采用这种设置这种设置在插入后会在块上预留大量的空间(高PCTFREE)并使得将块放回到freelist 之前必须几乎为空(低PCTUSED)
低PCTFREE高PCTUSED
如果你只想对表完成INSERT 或DELETE或者如果你确实要完成UPDATE但UPDATE 只是缩小行的大小此时这种设置就很适合
()行迁移row migration
行迁移是指由于某一行变得太大无法再与其余的行一同放在创建这一行的块中(块中已经放不下这一行)这就要求这一行离开原来的块行迁移只会影响性能