`

oracle段管理分析(转)

阅读更多

这文章写得很好,很适合我这种初学都看所以就转了。

原文地址:http://blog.sina.com.cn/s/blog_555948f801008xxz.html

 

(1)段、区段、块
Oracle中的段segment是占用磁盘存储空间的一个对象。从逻辑上讲一个数据库由若干表空间(TABLESAPCE)组成,每个表空间有若干个表(TABLE),每个表又可以分为若干数据段(DATA SEGMENT),索引段等,每个段又可分为若干数据库区间(EXTENT),每个区间由若干数据块(BLOCK)组成。区段(EXTENT)是最小的分配单。块(BLOCK) 是最小的存储单位。

 

 

(2)常见的段类型
1聚簇cluster:分为散列聚簇和B*树聚簇,通常用于存储多个表上的相关数据。

              可以在聚簇段中建表,此时这个表可能与其它表同在一个聚簇段中。
2表table:表段用于保存一个数据库表的数据,是最常用的段类型,通常与索引段结合使用。
3表分区partition或子分区subpartition:主要用于分区,与表段类型。
4索引index:这种段类型用于保存索引结构。
5Lob分区、子分区、索引、Lob段:用于保存大对象的结构。每个LOB列需要分别创建两个段,
一个用于存储CLOB或BLOB的

                               实际数据块logsegment,另一个是用于跟踪这些LOB块在哪里的lobindex。
6嵌套表nested table,这是为嵌套表指定的段类型。
7回滚段,用于存放undo的数据。

 

 

(3)段的管理
3.1手动段空间管理Manual Segment Space Management

手动设置FreeLists、FreeList Groups、PctUsed、其它参数来控制如何分配、使用、重用段空间。MSSM是oracle的遗留实现,许多版本都支持MSSM。

 

3.2自动段空间管理Automatic Segmnet Space Management

只需要控制与空间使用相关的PctFree,其它参数被忽略。ASSM只有在9i版本后才被引入,用于减少MSSM中的太多参数的管理。


应用于ASSM段的存储设置只有Buffer_Pool、PctFree、IniTrans、MaxTrans(10g后的版本都会忽略这个参数),其它存储和物理属性参数都不适用于ASSM段。


段空间管理是从段的表空间继承来的一个属性,而且段都没有跨表空间,段要使用ASSM就必须位于支持ASSM空间管理的表空间中。


3.3HWM高水平线
HWM是随着表数据的增长而增长的;只有重建、截除、收缩对象时,HWM才会降低。HWM很重要,因为在oracle进行全表扫描时会扫描HWM下的所有块,即使这张数据库表不包含任何数据。


TrunCate会把表的HWM重新置为0,还会截除表上的相关索引,而DELETE整张表时并没有修改HWM,所以如果打算删除表的所有行,应尽量使用TrunCate。

 

在MSSM表空间中,段只有一个HWM。但在ASSM表空间中,除了HWM外,还有一个低HWM。这是因为在ASSM中,HWM推进时,ORACLE并没有立即格式化所有的物理块,而是只在第一次使用时才会完成格式化,以便安全读取。

 

3.4freelists

freelists是使用MSSM表空间时,oracle使用块时,需要把块放在freelist或从freelist中删除,freelists可能对性能有很大的提升或有很大的影响。

而在ASSM中,没有也不用去设置freelist参数:
create tablespace assm datafile size 10m autoextend on next 1m segment space management auto;
create table xxx(......) tablespace assm;

 


(4)pctfree与pctused
PctFree告诉oracle应该在块上保留多少空间来完成将来的更新,默认值是10%。如果自由空间的百分比高于PctFree指定值,这个块就称为自由的。PctUsed告诉oracle应在当前不自由的块上自由空间的百分比需要达到多大时,才能使它再次变为自由的,默认值为40%。


使用MSSM 时,这两个参数设置控制着块何时放入freelist 中,以及何时从freelist 中取出。如果使用默认值:PCTFREE为10,PCTUSED为40,那么在块到达90%满之前(有10%以上的自由空间),这个块会一直在freelist 上。一旦到底90%,就会从freelist 中取出,而且直到块上的自由空间超过了块的60%时,才会重新回到freelist上,在此之前,这个块一直不在freelist上。

 

使用ASSM 时,PCTFREE 仍然会限制能否将一个新行插入到一个块中,但是它不会控制一个块是否在freelist上,因为ASSM根本不使用freelist。在ASSM 中,PCTUSED参数将被忽略。


如果把块的PCTFREE 设置得过高,就会浪费空间。如果把PCTFREE 设置为50%,而你从未更新数据,那么每个块都会浪费50%的空间。不过,对行初始很小,现在想将行的大小加倍,这种情况下50%的设置就非常合理。但是倘若PCTFREE 设置得太小,更新行时就会导致行迁移。

 

高PCTFREE,低PCTUSED

如果你插入了将要更新的大量数据,而且这些更新会频繁地增加行的大小,此时就适合采用这种设置。这种设置在插入后会在块上预留大量的空间(高PCTFREE),并使得将块放回到freelist 之前必须几乎为空(低PCTUSED)。

 

低PCTFREE,高PCTUSED

如果你只想对表完成INSERT 或DELETE,或者如果你确实要完成UPDATE,但UPDATE 只是缩小行的大小,此时这种设置就很适合。

 

 

(5)行迁移row migration 

行迁移是指由于某一行变得太大,无法再与其余的行一同放在创建这一行的块中(块中已经放不下这一行),这就要求这一行离开原来的块。行迁移只会影响性能。

oracle的段管理

oracle的段管理

图10-3:原来的块上有1/7的自由空间,第4行也占用块上1/7的空间,现在假定想把第4行update为原来的两倍大小;
图10-4:此时,即使oracle合并了自由空间,自由空间还是小于第4行的当前大小,

        所有oracle并没有合并自由空间,块仍保持原样;
图10-5:由于容纳不了新第4行的大小,所以oracle会移动或迁移这一行。

        当然也不是简单移动,oralce必须留下一个转发地址(指针);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics