段:

  一个段中至少包含一个区,即表示在物理上占了空间。 字典表:***DBA_SEGMENTS*** 通过查询dba_objects 获取对象id和段id


(1)刚建表时,对象id和段id是相等的,之后对象id是不会再变的,但是段id会变,例如truncate后,段id的值会增加1(11g需插入一行数据才能看到段的变化)
(2)像存储过程、函数、视图、包、数据类型等这些是没有段id的

  段的管理分为自动段空间管理ASSM和手动段空间管理MSSM
  自动段空间管理(ASSM),目的是处理大并发的插入,ASSM的结构


BMB由三级构成,L3 BMB是顶级别,它含有L2 BMB的列表,没有饱和信息。
L2 BMB是次级,它含有L1 BMB,并有L1 BMB的饱和信息。
L1 BMB是最后一级,它含有Block的饱和度(5级)。跟Extent Map一样,第一个 L3 BMP含在SegmentHeader中,出现第二个L3 BMP的可能性几乎没有。表非常大的时候,可能会出出现第二个L2 BMB。对于8K的block,小于2G的表,基本上只有1个L2,L3 BMB。(摘自http://www.itpub.net/forum.php?mod=viewthread&tid=298088&highlight=

块:

  常见的块大小是8KB,假设一个区是1MB,块大小是8KB,则每个区是128个块。
 块包含两部分:
①管理信息(比如块头的SCN、ITL槽等)
②用户数据
  如果删除了一行,在回滚,行的位置不会发生变化,删除时只是打个标记,声明此行所占的空间可以被覆盖,在没有提交事务时,事务加在行上的锁没有释放,此行虽打上了删除的标志,但空间仍不会被其他行覆盖没回滚时,行原来在哪,就还插入在哪里,不需要进行寻找空间的操作。但如果删除后提交再插入,行的位置肯定会发生变化。

文件id,块id,行号(使用dbms_rowid解析)

select 
dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_id,a.password
 from sunyinchuan.FINERPT_XIAJIA  a


可以看出这张表的行号是52行放在一个块上

标记位

  堆表是无序的(如果使用一个session插是有序的)
oracle在插入行时,会在数据块中设立一个标记位,记录空间使用到哪了,块中用户数据所占空间是从下往上分配的。
  假设在8192字节的块中插入了5行数据,每行100字节,也就是说,空间已使用到7692(8192-500)字节处,那么标记为的值就是7692,如果删除了其中一行并提交,标记为的值不会变,还是7692,再重新插入被删除行或新行,将会以7692处向上查找可用空间,标记值到达管理信息的边界时,标记位会在变成8192。

HWM高水平线(摘自:http://blog.itpub.net/24217871/viewspace-693249/)

  HWM是随着表数据不断增长的;只有重建、截除、收缩对象时,HWM才会降低。HWM很重要,在oracle进行全表扫描时会扫描HWM下的所有块,即使这张数据库表不包含任何数据。
  truncate会把表的HWM重新置为0,还会截除表上的相关索引,而DELETE整张表时并不修改HWM,所以如果打算删除表的所有行,应尽量使用TrunCate。
  在MSSM表空间中,段只有一个HWM。但在ASSM表空间中,除了HWM外,还有一个低HWM。这是因为在ASSM中,HWM推进时,ORACLE并没有立即格式化所有的物理块,而是只在第一次使用时才会完成格式化,以便安全读取。

HWM对数据插入的影响:

 首先,插入操作分为两种:
①常规插入
②直接路径插入
  常规插入时,会在HWM下寻找空间,HWM不断抬高,当请求新的空闲块,并且现有空闲列表中的块不能满足要求时,HWM指向的块将被标记为已使用,然后HWM将移动指向下一个未使用过的块。
直接路径插入,采用/*+ append */可以指定插入采用直接路径插入,插入时,会在HWM上寻找空间,HWM也会抬高到插入的数据上方,它比较浪费磁盘空间.

ASSM的插入

  10g以后,oracle默认表空间类型是ASSM,不需要专门指定了,对于插入的数据,不同的会话会将行插入到不同的块中,oracle是根据pid计算出随机数,随机将行插入在不同块中,只要pid不一样,行就会插在不同的块中。
ASSM可以增大插入并发量,但并发插入量还要受高水平线的限制,如果HWM设置的过低,初期并发时,oracle随机到的块可能不够用。
  假设块大小是8kb一个,则表不大于1MB时,每个区有128个块,并发时,oracle随机寻找块,会对HWM以下的块进行随机,假设oracle的随机算法很可靠,如果前期并发大于HWM以下的块的数量,则会出现多个会话争用一个块的情况,当表不断增大,区跟着增大,区下的块增多,这种并发争用会慢慢消失。

posted on 2022-05-16 19:02  xc川  阅读(131)  评论(0)    收藏  举报